从Python运行bash脚本

2 投票
1 回答
1818 浏览
提问于 2025-04-17 20:12

我遇到了以下问题:

我有一个简单的脚本,叫做 test.sh:

#!/bin/bash

function hello() {
    echo "hello world"
}
hello

当我在命令行中运行它时,得到了预期的结果:

$ ./test2.sh
hello world

但是,当我尝试从 Python (2.7.?) 运行它时,我得到了以下结果:

>>> import commands
>>> cmd="./test2.sh"
>>> commands.getoutput(cmd)
'./test2.sh: 3: ./test2.sh: Syntax error: "(" unexpected'

我觉得它可能是用 "sh" 而不是 bash 来运行这个脚本。我这么认为是因为当我用 sh 来运行它时,也出现了同样的错误信息:

$ sh ./test2.sh
./test2.sh: 3: ./test2.sh: Syntax error: "(" unexpected

另外,当我在 Python 中用 "bash" 来运行这个命令时,它就能正常工作:

>>> cmd="bash ./test2.sh"
>>> commands.getoutput(cmd)
'hello world'

我的问题是:为什么 Python 选择用 sh 来运行这个脚本,而不是 bash,尽管我在脚本开头加了 #!/bin/bash 这一行?我该怎么做才能解决这个问题(我不想在 Python 中加上 'bash',因为我的脚本是由远程机器运行的,我无法控制它们)。

谢谢!

1 个回答

3

看起来还有其他问题——你提到的shbang和commands.getoutput应该是可以正常工作的。把你的脚本改成这样:

#!/bin/bash
sleep 100

然后再运行这个应用。用ps f命令检查一下实际的进程树。确实,getoutput会调用sh -c ...,但这并不会改变哪个shell来执行你的脚本。

根据问题中描述的最简单的测试,我看到以下的进程树:

11500 pts/5    Ss     0:00 zsh
15983 pts/5    S+     0:00  \_ python2 ./c.py
15984 pts/5    S+     0:00      \_ sh -c { ./c.sh; } 2>&1
15985 pts/5    S+     0:00          \_ /bin/bash ./c.sh
15986 pts/5    S+     0:00              \_ sleep 100

所以单独来看,这个是按预期工作的——python调用sh -c { ./c.sh; },这个命令是由第一行指定的shell(bash)来执行的。

确保你在执行正确的脚本——因为你在用./test2.sh,所以要再确认一下你在正确的目录下,并且执行的是正确的文件。(print open('./test2.sh').read()的输出是否是你预期的?)

撰写回答