我在文件中有以下内容
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中
答案 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.py
,bash
会尝试将demo.py
解释为shell脚本文件,但会失败,即python
无法执行
答案 2 :(得分:4)
您需要将其作为bash -c ./demo.py
或sh -c ./demo.py
运行,否则文件中的每一行都将作为bash命令执行(而不是使用she-bang执行文件)。
答案 3 :(得分:0)
=> 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