2

我遇到以下问题:

我有这个简单的脚本,叫做 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运行的)。

谢谢!

4

1 回答 1

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

sh -c { ./c.sh; }因此,单独来看,这可以按预期工作 -由第一行(bash)中指定的 shell 执行的python 调用。

确保您正在执行正确的脚本 - 因为您正在使用./test2.sh,请仔细检查您是否在正确的目录中并执行正确的文件。(print open('./test2.sh').read()返回你所期望的吗?)

于 2013-03-25T09:05:25.193 回答