這種錯誤只能說是坑,如果沒有見到過,很可能就要摔里頭。解決問題是重要的,但弄明白問題的來源,往往更為重要。
所以要先扯一下,換行和回車的歷史遺留問題。
在計算機出現之前,有個玩意叫電傳打字機。每秒鍾可以打10個字符,但是在打完一行需要換行時,要用去0.2s。
這正好可以打2個字符,這段時間里如果有字符傳過來,那么這些字符將被丟失。
很顯然,要解決這個問題,最簡單的辦法就是浪費這個0.2s。同時,我們在寫東西時,要把手換到下一行及每行的首位置,也就是說這是兩個動作。
自然而然地,研發人員在每一行后面添加了兩個表示結束的字符(回車+換行)。
所謂“回車”:讓打字機的打印頭重新回到一行的首位置(左邊界);所謂“換行”:讓打字機把紙向下移一行。
后來,計算機來了,操作系統也來了。於是,坑也來了。不同的操作系統對這個機器的“復位+走紙”的表示是不同的:
OS |
表示 |
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命令即可。