2010-11-02 174 views
2

當我通過SSH登錄到特定的Ubuntu Linux(10.04 64位)主機時,我得到了一個bash shell。從這裏我能夠運行特定的Python腳本,與可執行位集,有這個作爲第一行:在Ubuntu中以新用戶身份運行腳本時出現Shell問題

#!/usr/bin/env python 

但是,如果通過SSH另一個(新)用戶登錄到同一臺主機,並嘗試運行此腳本(或本複印件),他們得到這個錯誤:

$ ./script.py 
: No such file or directory 

事實證明,這個文件實際上是一個DOS換行符的文件,但我可以從我登錄時運行此罰款。如果我將它轉換成UNIX格式,那麼其他人也可以很好地運行它。

腳本也運行正常對我們雙方的,如果我們用「蟒蛇」前綴,而不管DOS/UNIX格式:

$ python ./script.py 
blah blah blah... 

進一步就此,一旦腳本轉換爲UNIX格式和其他用戶可以運行它,它仍然不能從Makefile運行 - make顯示與上面相同的錯誤。

我讀到/ bin/sh是Ubuntu中的'dash'(而不是'bash')shell,我想知道這是否與此有關,因爲它的行爲與bash不同。如果是這樣,我想知道我的登錄(它工作得很好,並且已經完成多年)和這個新用戶的登錄顯示各種奇怪的行爲之間有什麼不同。從哪裏開始尋找?

也可能相關 - 新用戶是由類似服務(Active Directory集成客戶端)自動創建的,並且可能此服務以某種方式錯誤地配置了新用戶。

我也試過把第一行改成#!/ usr/bin/python沒有區別。

這兩個用戶都在運行bash shell作爲其登錄shell。

+0

您是否安裝了'/ usr/bin/env'? '/ usr/bin/env python'是否從命令行運行?另外,shell的名字是「bash」。 – 2010-11-02 21:07:13

+0

@ S.Lott:*一個*的shell命名爲「bash」。 OP指的是Debian Almquist SHell('dash')在Ubuntu系統上默認提供'sh'的方式。 – 2010-11-02 21:24:36

+0

嘗試了第三個用戶,也是新的(所以同樣使用不同的名稱創建一個新帳戶),並且這個用戶沒有問題。這個問題似乎與第一位新用戶隔離開來。 – meowsqueak 2010-11-02 21:30:42

回答

2

我已經解決了這個問題,我會爲了完整而自己回答。

該問題源於我們在Cygwin/Windows上使用git,並且使用core.autocrlf = true。我們出於各種原因這樣做,並且改變並非微不足道。

登錄到Linux機器的原始新用戶還將其Cygwin .gitconfig(其中包含core.autocrlf = true)複製到他們的新帳戶。然後他們克隆了包含相關python腳本的git存儲庫。我沒有在原始問題中包含這些信息,因爲我只是沒有建立聯繫。我不想通過解釋看似不相關的東西來混淆這個問題。後見之明?

無論如何,這使得克隆DOS格式的所有腳本,這解釋了爲什麼沒有什麼可以正常工作的這個用戶。它還解釋了爲什麼錯誤消息沒有用,因爲^ M回車符將光標返回到沒有換行的行的開頭,然後「沒有這樣的文件或目錄」覆蓋了消息的有用部分。當我將PATH設置爲一個沒有權限的目錄時,我發現了這一點,並且得到了「Permission deniedn」的損壞消息 - 這個流氓'n'讓我思考。

所以我最初的假設是我們都運行相同的腳本(因爲它們都來自同一個git倉庫)是錯誤的 - 我們實際上並沒有運行相同的腳本。對於我們大多數人來說,這是一個UNIX格式的Python腳本,但是對於這個用戶來說,它是DOS格式。最終發現這是一個相當簡單的問題,但我們又一次被Windows相關問題困擾。不會是最後一次。

謝謝大家的回覆。

3

神祕的是爲什麼你能夠在沒有轉換的情況下運行它。所有其他行爲是預期的,因爲你的shebang告訴env執行不存在的python^M還是呢?如果您的$PATH(但不在其他用戶的)中有一個名爲python^M的符號鏈接或腳本可以解釋這種奇怪的行爲。執行type -a python^M(按Ctrl-V,然後按Ctrl-M生成^M)。

如果你改變shebang到#!/usr/bin/python那裏應該是一個區別。你應該得到-bash: ./script.py: /usr/bin/python^M: bad interpreter: No such file or directory而不是: No such file or directory

+0

你提供了我需要的線索來解決這個問題 - 我主要關心的是爲什麼我沒有爲其他用戶獲得相同的行爲。事實證明,問題是與git配置 - 腳本從git存儲庫中出來。新用戶從他們的Cygwin安裝中複製了它們的.gitconfig,這恰好包含core.autocrlf = true - 這將存儲庫中的所有腳本轉換爲DOS格式。這就是用戶之間存在差異的原因。 – meowsqueak 2010-11-02 23:22:28

5

我遇到了同樣的問題,從上面的回答中不能立即明白問題是什麼,或者解決方案是什麼,但我想我現在明白了。

顯然窗口換行符編碼稍有不同。雖然cygwin可以以unix格式進行編碼,但我使用Windows文本編輯器(Notepad ++)編寫我的腳本,默認格式爲windows CRLF編碼。 Notepad ++可以重新配置爲unix作爲默認格式。我的同事在Linux或Mac機上生成的所有腳本都可以正常工作,但是我會在Windows中編輯它們,而且在我嘗試在Linux機器上運行一個腳本之前,可能會出現問題。

首先,這可以診斷在任一的cygwin或bash用:

cat -v file.py 

,其中每個線將在端部具有一個^ M,如果它是在DOS格式

其次,cygwin的具有簡單的轉換器:

d2u file.py 

並且您可以檢查是否在第一步中工作。我所有的腳本都會照常運行。

相關問題