2012-12-02 37 views
0

我在windows中有一些python文件,我通過samba將它們傳輸到我的gentoodos和unix中的python文件

我檢查他們的模式是可執行的,我用./xxx.py運行它,但得到一個錯誤:

: No such file or directory

我不安的是它不會提示是什麼文件不在這裏。

但是當我使用python xxx.py時,它可以以正確的方式運行。

,然後我檢查在VIM使用set ff CR字符,並發現它是dos,然後我用set ff=unix來設置它,現在它可以通過使用./xxx.py

運行,但我不知道爲什麼ff=dos?可以使用python xxx.py

回答

2

DOS文件用CR + LF結束行,Unix文件只用LF。這意味着當Unix讀取你的文件來確定可執行文件的名字是什麼時,這個可執行文件的名字以CR結尾。像這樣:

#!/usr/bin/python 

print("Blah!") 

當我跑,我得到:

$ ./test.py 
bash: ./test.py: /usr/bin/python^M: bad interpreter: No such file or directory 

你的情況會發生什麼事是,CR字符(^ M以上)不被打印出來,而是由你的「執行」終端,即光標將返回到行的開始。因此,^ M之前,一切都覆蓋:

$ ./test.py 

:壞的解釋:沒有這樣的文件或目錄

這就是爲什麼你不能在Unix DOS文件結尾的執行文件。

任何即使是遠程現代的源代碼管理系統都會爲您處理這個問題,並在檢出源代碼時更改文件結尾。

+0

並非所有的源代碼管理系統都會自動破壞你的行結束符。例如,我知道如果你想要這個功能,git需要你打開'autocrlf'。 – lunixbochs

+0

@lunixbochs所以它處理它。 –

3

Windows行結束符是CRLF或\r\n

Unix只使用\n

當操作系統讀取您的shebang行時,它會看到#!/usr/bin/python\r。它不能運行這個命令。

從unix shell中查看此行爲的一種簡單方法是$(echo -e 'python\r')(它嘗試運行python\r作爲命令)。該輸出也將類似於: command not found

Windows下的許多高級代碼編輯器都支持使用unix行尾本地保存。