標題無“轉載”即原創文章,版權所有。轉載請注明來源:http://besteam.im/blogs/article/31/。
我一直對字符界面有抵觸感,即使會用vim,我的linux腳本(python/bash script)一般都是在windows下寫完調試好,然后傳到linux上的。
不過寫好的linux腳本傳到linux上運行的時候卻經常報這樣的錯:
$ cat fish.py #!/usr/bin/env python print "fish" $ chmod u+x fish.py $ ./fish.py : No such file or directory
找不到文件?可是無論怎么修改腳本,都沒辦法解決。找不到文件,那應該是第一行的env命令有問題啰?真是讓人讓人摸不着腦袋,其實這是因為換行符的問題。
我們知道,linux下的文本文件以ascii碼為10的字符表示換行。而windows下則使用連續的13和10兩個字符。在python和c語言里使用\r
代表ascii符為13的字符,叫做回車符,而\n
代表ascii碼為10的字符,叫做換行符。對於:
#!/usr/bin/env python\r\n
這樣一行文本,windows下的程序會認為#!/usr/bin/env python
就是一行。而linux呢,則會認為#! /usr/bin/env python\r
是一行。於是,剛才的錯誤就出來了,因為根本沒有python\r
這個文件嘛。
有個比較奇怪的地方,仔細想想,env
如果出錯的話應該是報這樣的錯誤信息的:
/usr/bin/env: python : No such file or directory (python后面有一個回車符)
那為什么現在是:
: No such file or directory
這主要是因為\r
這個字符的緣故。在linux終端下,輸出\r
會什么都不顯示,只是把光標移到行首。看看我用python取得env輸出的出錯信息:
/usr/bin/env: python\r: No such file or directory
於是終端雖然輸出了/usr/bin/env: python
,但是碰到\r
后,光標會被移到行首,接着輸出了:No such file or directory
把前面的覆蓋掉了。於是我們就看到那個莫名其妙的出錯信息了。
可能有人會怪windows怎么那么傻,一個\n
不就可以了,為什么要用\r\n
呢,給我們造成了多大的麻煩。其實這也不能怪windows。使用\r\n
的歷史可以追溯到遙遠的19世紀。 那時候發明的打字機主要結構是一個實心圓筒+排列成菊花狀的字模。紙張被牢牢地固定在圓筒的表面上。當我們按下一個字母的時候,機械裝置引動字模"飛"向紙張,同時圓筒前的色帶升起,用力地印下去,於是紙張上面就出現一個字了。印完之后,機械裝置自動地讓圓筒向左移動一個字母格子,方便打印下一個字符。打完一行之后,左手邊上有一個搖桿,搖一下,圓筒就可以滾動一個行距,這是換行。不過,因為打字的時候圓筒總會不斷地向左移動,所以打字員還需要用力地把圓筒推回右邊,這就是傳說中的回車了。在計算機里常見的換行操作在打字機里需要換行+回車兩個操作。自然,計算機里不用這么麻煩,不過windows喜歡看起來更兼容一點。於是換行就成了\r\n
了。
解決辦法:
Lookup up:
:set fileformat=unix
:set fileformat=dos
This can be used on either platform to switch to the other encoding.