什么可能导致脚本在第一行中有`#!/ usr / bin / env python`时找不到python?

试图在Ubuntu 12.04上运行casperjs。 在我运行后安装它我得到:

09:20 $ ll /usr/local/bin/casperjs lrwxrwxrwx 1 root root 26 Nov 6 16:49 /usr/local/bin/casperjs -> /opt/casperjs/bin/casperjs 09:20 $ /usr/bin/env python --version Python 2.7.3 09:20 $ cat /opt/casperjs/bin/casperjs | head -4 #!/usr/bin/env python import os import sys 09:20 $ casperjs : No such file or directory 09: 22 $ python Python 2.7.3 (default, Sep 26 2013, 20:03:06) [GCC 4.6.3] on linux2 

所以Python存在并且可以运行,casperjs指向正确的位置,它是一个python脚本。 但是当我运行它时,我得到“没有这样的文件”。

我可以通过更改casperjs python文件的第一行来修复它:

 #!/usr/bin/env python 

至:

 #!/usr/bin/python 

结果:

 $ casperjs --version 1.1.0-DEV 

我设法解决了这个问题,但我想知道为什么它不适用于#!/usr/bin/env python ,因为这似乎是一个普通的解释器行。 我有错误的配置吗?

以下是获取casperjs的步骤:

 $ git clone git://github.com/n1k0/casperjs.git $ cd casperjs $ ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs $ casperjs : No such file or directory 

如果你看到错误“:没有这样的文件或目录”(冒号前没有任何内容),这意味着你的shebang行最后有一个回车符,大概是因为它是在Windows下编辑的(它使用CR,LF作为行分隔符)。 在shell打印消息的开头之后,CR字符会使光标移回到行的开头,因此您只能看到CR之后的部分,它结束了作为错误消息一部分的解释器字符串。

删除CR:shebang行需要有一个Unix 行结束 (仅限换行 )。 Python本身允许CRLF行结尾,因此其他行上的CR字符不会受到伤害。 另一方面,Shell脚本必须没有CR字符。

要删除Windows行结尾,可以使用dos2unix :

 sudo dos2unix /usr/local/bin/casperjs 

或者sed:

 sudo sed -i -e 's/\r$//' /usr/local/bin/casperjs 

如果您必须在Windows下编辑脚本,请使用编辑器来处理Unix行结尾(即比记事本更少脑死亡的东西)并确保在编辑Unix文件时将其配置为编写Unix行结尾(即仅LF)。