#!/ usr / bin / python(sha-bang或she-bang)在bash中不起作用

时间:2012-02-14 00:08:43

标签: python bash ubuntu

我在文件中有以下内容

demo.py:- //可执行位集

#!/usr/bin/python
import os

我在终端中使用了命令 bash demo.py 并期待它 第一行由bash解释,它将文件处理为python解释器。 但它调用二进制文件“/ usr / bin / import”(使用strace计算)。 sh demo.py 也是如此。 但运行 ./ demo.py 有效。男子巴什说

“如果程序是以#!开头的文件,则是第一个的剩余部分 line指定程序的解释器。“

没有发生。

使用bash版本

$ bash --version

GNU bash,版本4.2.8(1)-release(i686-pc-linux-gnu) 版权所有(C)2011 Free Software Foundation,Inc。 许可证GPLv3 +:GNU GPL版本3或更高版本http://gnu.org/licenses/gpl.html

这是免费软件;您可以自由更改并重新分发它。 在法律允许的范围内,不作任何担保。

在Ubuntu 11.04中

4 个答案:

答案 0 :(得分:8)

bash文档是正确的:当您在bash命令提示符下输入./demo.py时,bash使用shebang行来确定将运行该脚本的可执行文件。

当你执行bash demo.py时,bash当然会尝试将其作为bash脚本运行。因为你说过了。 (想象一下,如果你有一个不正确的shebang行的bash脚本 - 你将如何运行它?通过这种方式将它直接传递给bash。)

如果要启动运行Python脚本的另一个bash shell,请使用bash -c ./demo.py作为bash命令执行demo.py 而不是bash脚本。但是你不应该只是为了运行Python脚本而启动另一个shell。

答案 1 :(得分:6)

我认为你与she-bang系列的含义相混淆。

#!/usr/bin/python

这意味着./demo.py将以/usr/bin/python demo.py执行。

但是,对于/bin/bash demo.pybash会尝试将demo.py解释为shell脚本文件,但会失败,即python无法执行

答案 2 :(得分:4)

您需要将其作为bash -c ./demo.pysh -c ./demo.py运行,否则文件中的每一行都将作为bash命令执行(而不是使用she-bang执行文件)。

答案 3 :(得分:0)

顺便说一句,提防来自Windows网络或文档的cut'n'paste,在shebang不能正常工作后的CR-LF:

=> head -1 myScript.py | od -cx

<00> 0000000#! / u s r / b i n / e n v p

       2123    752f    7273    622f    6e69    652f    766e    7020

0000020 y t h o n \ r \ n

       7479    6f68    0d6e    000a

0000027