#!/usr/bin/python(sha-bang或she-bang)在bash中无法工作

0 投票
3 回答
5540 浏览
提问于 2025-04-17 12:59

我在文件里有以下内容:

demo.py:- // 可执行位已设置

#!/usr/bin/python
import os

我在终端里使用了命令 bash demo.py,希望第一行能被bash解释,然后让这个文件交给python解释器处理。可是它却调用了二进制文件 "/usr/bin/import"(我用strace查出来的)。用 sh demo.py 也是一样的情况。不过运行 ./demo.py 是可以正常工作的。man bash 里说:

“如果程序是一个以 #! 开头的文件,第一行的其余部分指定了程序的解释器。”

但这并没有发生。

使用的bash版本:

$ bash --version

GNU bash,版本 4.2.8(1)-release (i686-pc-linux-gnu) 版权所有 (C) 2011 自由软件基金会,Inc. 许可证 GPLv3+: GNU GPL 第3版或更高版本 http://gnu.org/licenses/gpl.html

这是自由软件;你可以自由修改和重新分发。 在法律允许的范围内,没有任何保证。

在Ubuntu 11.04上运行。

3 个回答

3

你需要用 bash -c ./demo.pysh -c ./demo.py 这样的方式来运行它。否则,文件里的每一行都会被当作一个bash命令来执行,而不是通过文件开头的那种特殊标记来运行这个文件。

7

我觉得你对“she-bang”这一行的意思有点混淆。

#!/usr/bin/python

这意味着运行 ./demo.py 时,会执行 /usr/bin/python demo.py

但是,如果你用 /bin/bash demo.py,那么 bash 会把 demo.py 当作一个脚本文件来解析,这样就会出错,也就是说 python 不会被执行。

10

bash的文档是正确的:当你在bash命令提示符下输入 ./demo.py 时,bash会通过文件开头的“shebang”行来判断用什么程序来运行这个脚本。

而当你输入 bash demo.py 时,bash自然会尝试把它当作一个bash脚本来运行,因为你就是这么告诉它的。(想象一下,如果你有一个shebang行写错的bash脚本,你会怎么运行它?就是直接用bash来执行,就像这样。)

如果你想启动另一个bash环境来运行你的Python脚本,可以使用 bash -c ./demo.py 来把 demo.py 当作一个bash命令来执行,而不是当作bash脚本。不过,实际上你不需要为了运行一个Python脚本而启动另一个环境。

撰写回答