从Python运行bash脚本
我遇到了以下问题:
我有一个简单的脚本,叫做 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()
的输出是否是你预期的?)