2

次の問題が発生しています。

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'

bashではなく「sh」からスクリプトを実行すると思います。shで実行すると同じエラーメッセージが表示されるため、そう思います。

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

さらに、Python から前に「bash」を付けてコマンドを実行すると、次のように動作します。

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

#!/bin/bash私の質問は次のとおりです。スクリプトの先頭に行を追加したにもかかわらず、python が bash ではなく sh を使用してスクリプトを実行することを選択するのはなぜですか? どうすれば正しくできますか(私のスクリプトは、私が制御できない離れたマシンによってPythonから実行されているため、Pythonで先行する「bash」を使用したくありません)。

ありがとう!

4

1 に答える 1

3

他にも問題があるようです。ここに示すように、shbang と commands.getoutput は適切に機能するはずです。シェルスクリプトを次のように変更します。

#!/bin/bash
sleep 100

アプリを再度実行します。ps f実際のプロセスツリーが何であるかを確認してください。getoutput が を呼び出すのは事実ですがsh -c ...、これはスクリプト自体を実行するシェルを変更するべきではありません。

質問で説明されている最小限のテストから、次のプロセス ツリーが表示されます。

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)で指定されたシェルによって実行されるpython呼び出し。

正しいスクリプトを実行していることを確認してください - を使用して./test2.shいるため、正しいディレクトリにいることと正しいファイルを実行していることを再確認してください。(print open('./test2.sh').read()あなたが期待したものを返しますか?)

于 2013-03-25T09:05:25.193 に答える