bash – 什么可能导致脚本在第一行中有`#!/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 line需要有一个Unix line ending(仅限换行). 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).

上一篇:用create-react-app创建项目后怎么把默认的3000端口改掉?


下一篇:为什么有些python脚本以#!/usr/bin/env python开头?