[System] CR和LF的戰爭
[System] CRLF和LF的戰爭
由於電腦系統的競爭,造成各家都喜歡自己有推出認為最好的格式,但這部分在多系統使用者上就會變成一個大麻煩,今天就來提提其中一個最著名:換行符號
簡單一點的說,目前OS大致上分三類,這三類的換行符號都不一樣,
- Windows系:
在微軟的MS-DOS和Windows中,使用"回車CR('\r')"和"換行LF('\n')"兩個字符作爲換行符,即CRLF("\r\n")
-
Unix系:
Unix系統中,每行結尾只有換行LF,即"\n"
-
MacOS系:
Mac系統中,每行結尾是回車CR 即"\r"
而CR(Carriage Return)用符號"\r"表示, 十進制ASCII代碼是13, 十六進制代碼爲0x0D;
LF(Line Feed)使用"\n"符號表示, ASCII代碼是10, 十六進制代碼爲0x0A,也因為使用的符號不同會造成以下的現象,
- Unix/Mac系統下的文件在Windows裏打開的話,所有文字會變成一行
- 而Windows裏的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號
- Linux保存的文件在windows上用記事本看的話會出現黑點
錯誤的例子
這就會造成像是在Windows上編寫Shell Script後放到Linux系統中執行時,會出現符號錯誤的警告,
利用指令可以檢查出,文件帶有^M的符號,
cat -v xxxx.sh
解決方法
解決方法有很多種,像是利用sed或tr指令把^M砍掉,或是利用unix2dos、dos2unix指令做文件類型轉換,或是利用IDE工具直接幫你做轉換,這邊介紹一下notepad++和Sublime Text3的做法,指令的部分有興趣的可以在自己尋找,
Sublime Text3
到View ---> Line Encodings 底下有三個選項讓你選,如果你是用Windws版的Sublime寫了Shell要在Linux上執行的話,請改用Unix換行符號,這時候存檔後的.sh檔案就能就在Linux上執行
notepad++
從編輯 ---> 換行格式 底下的選項選擇你要的格式後再存檔就可以了,
以上。
Reference
解决Unix-like、Windows系统之间文本换行符不同的问题
A curl utility problem that strongly effects my work with Bash on Windows
cygwin下面写shell,运行出错:syntax error near unexpected token `$’do\r”