[System] CR和LF的戰爭

[System] CRLF和LF的戰爭

由於電腦系統的競爭,造成各家都喜歡自己有推出認為最好的格式,但這部分在多系統使用者上就會變成一個大麻煩,今天就來提提其中一個最著名:換行符號

簡單一點的說,目前OS大致上分三類,這三類的換行符號都不一樣,

  1. Windows系:

    在微軟的MS-DOS和Windows中,使用"回車CR('\r')"和"換行LF('\n')"兩個字符作爲換行符,即CRLF("\r\n")

  2. Unix系:

    Unix系統中,每行結尾只有換行LF,即"\n"

  3. 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系統中執行時,會出現符號錯誤的警告,

CRLF_001.png

利用指令可以檢查出,文件帶有^M的符號,

cat -v xxxx.sh

CRLF_002

解決方法

解決方法有很多種,像是利用sed或tr指令把^M砍掉,或是利用unix2dos、dos2unix指令做文件類型轉換,或是利用IDE工具直接幫你做轉換,這邊介紹一下notepad++和Sublime Text3的做法,指令的部分有興趣的可以在自己尋找,

Sublime Text3

到View ---> Line Encodings 底下有三個選項讓你選,如果你是用Windws版的Sublime寫了Shell要在Linux上執行的話,請改用Unix換行符號,這時候存檔後的.sh檔案就能就在Linux上執行

CRLF_003

CRLF_004

notepad++

從編輯 ---> 換行格式 底下的選項選擇你要的格式後再存檔就可以了,

CRLF_005

以上。

Reference

解决Unix-like、Windows系统之间文本换行符不同的问题

CRLF跟LF之區別 --- 隱形的 bug

A curl utility problem that strongly effects my work with Bash on Windows

cygwin下面写shell,运行出错:syntax error near unexpected token `$’do\r”

shell “syntax error near unexpected token '$'\r''” 错误解决方法

Add a Comment