我遇到了以下问题:
我有这个简单的脚本,叫做test.sh:
#!/bin/bash
function hello() {
echo "hello world"
}
hello
当我从shell运行它时,我得到了预期的结果:
$ ./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',因为我的脚本是由我无法控制的远程机器从python运行的。)
谢谢!
答案 0 :(得分:3)
似乎还有一些其他问题 - shbang和commands.getoutput应该正常显示在这里。将shell脚本更改为:
#!/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; }
,它由第一行(bash)中指定的shell执行。
确保您正在执行正确的脚本 - 因为您正在使用./test2.sh
,请仔细检查您是否在正确的目录中并执行正确的文件。 (print open('./test2.sh').read()
会回复您的期望吗?)