3

このコマンドを持つ:

    $command = "diff -bBdH --ignore-all-space <(echo 'hi') <(echo 'hi1')";
    echo $command;
    $result = shell_exec($command);

画面に次のように表示されます。

    sh: 1: Syntax error: "(" unexpected
    diff -bBdH --ignore-all-space <(echo 'hi') <(echo 'hi1')

コンソール出力の 2 行目をターミナルにコピー アンド ペーストすると、正しい結果が得られます。(別のマシンでも再現)。

ここで非常に単純なものが欠けていて、それが何であるかわかりません。


その上、なぜ私の出力が逆になるのですか?
コマンドを実行する前に明らかにエコーしているため、シェルの構文エラーはコマンドの後に表示されるはずです。shell_exec

4

2 に答える 2

4

あなたの構文はBashでは問題ありませんが、sh. 明示的に Bash で実行するか、Bashism を従来の Bourne シェルに変換します (やや難しいため、一時ファイルが必要になる場合があります)。

PHP が で使用するシェルを指定する方法を提供しているかどうかはわかりませんshell_execが、少なくともsh実行bashすることはできます。ただし、ネストされた引用は少しトリッキーになります。

shell_exec("bash -c 'diff -bBdH --ignore-all-space <(echo \"hi\") <(echo \"hi1\")'");

標準出力と標準エラー出力の順序は任意です。出力バッファリングにより、実行順序が異なっていても、通常の出力の前にエラー メッセージが出力される可能性がありました。単一のストリーム内では、順序付けられた出力に確実に依存できます。

于 2012-12-11T16:54:38.867 に答える
0

変数を引用符で囲み、エコー文字列を引用符で囲みましたか?

$command = "diff -bBdH --ignore-all-space <(echo '" . $str1 ."') <(echo '" . $str2 . "')";
echo $command;

変数を引用することは常に良い習慣だと思います。読みやすく、迷惑なエラーを解決するのに役立ちます。

于 2012-12-11T16:35:18.340 に答える