這種錯誤只能說是坑,若是沒有見到過,極可能就要摔裏頭。解決問題是重要的,但弄明白問題的來源,每每更爲重要。linux
因此要先扯一下,換行和回車的歷史遺留問題。shell
在計算機出現以前,有個玩意叫電傳打字機。每秒鐘能夠打10個字符,可是在打完一行須要換行時,要用去0.2s。windows
這正好能夠打2個字符,這段時間裏若是有字符傳過來,那麼這些字符將被丟失。spa
很顯然,要解決這個問題,最簡單的辦法就是浪費這個0.2s。同時,咱們在寫東西時,要把手換到下一行及每行的首位置,也就是說這是兩個動做。操作系統
天然而然地,研發人員在每一行後面添加了兩個表示結束的字符(回車+換行)。unix
所謂「回車」:讓打字機的打印頭從新回到一行的首位置(左邊界);所謂「換行」:讓打字機把紙向下移一行。blog
後來,計算機來了,操做系統也來了。因而,坑也來了。不一樣的操做系統對這個機器的「復位+走紙」的表示是不一樣的:ci
OStable |
表示im |
C語言/轉義字符 |
HEX表示 |
Windows |
回車+換行(CR/LF) |
\r\n |
0x0d0a |
Unix/Linux |
換行(LF) |
\n |
0x0a |
Mac OS |
回車(CR) |
\r |
0x0d |
因而,unix/mac下的文件若是在windows裏打開,全部文字會變成一行;而windows的文件在unix/mac下打開,每行的結尾會多出一個 ^M 符號。
我想在linux下執行一個shell腳本,而它恰巧又在windows中打開過,因而我就狠狠地摔在了這個坑裏。解決的辦法天然很簡單,一個dos2unix命令便可。