当脚本第一行有“#!/usr/bin/env python”时,什么原因导致脚本找不到 python?

当脚本第一行有“#!/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

答案1

如果您看到错误“:没有这样的文件或目录”(冒号前没有任何内容),则意味着您的 shebang 行末尾有一个回车符,大概是因为它是在 Windows 下编辑的(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)。

答案2

我正在使用 Visual Studio Code,并且是文本编辑器的新手。我收到了同样的错误,并尝试按照这篇文章中的步骤手动操作,但对我来说不起作用。但是,在 Visual Studio Code 的右下角提供了一个选项,可以动态切换 CR 和 LF,问题解决了。我不确定这是否适用,但如果您在文本编辑器中编程,它可能会通过提供一个按钮来切换来提供一个简单的答案。

相关内容