これらのような非BASHスクリプト(つまり、PHPスクリプト)からパイプされたシェルコマンドをいくつか実行する必要があります。
command1 | command2 | command3
そのため、command1
ゼロ以外の終了コードで失敗した場合、他の各コマンドも失敗します。これまでのところ、私が思いついたのは:
set -o pipefail && command1 | command2 | command3
ただし、ターミナルからは正常に実行されますが、スクリプトから実行されると、次のようになります。
sh:1:set:無効なオプション-o pipefail
@JonathanLeffler実行
—
デスモンドヒューム
/bin/sh set -o pipefail
すると、/bin/sh: 0: Can't open set
(と同じことsudo
)と表示されます。私が正しくテストしたことを願っています。システムはUbuntu 12です
試してみる必要があり
—
ジョナサンレフラー
/bin/sh -c "set -o pipefail"
ます。現状では、シェルは呼び出された現在のディレクトリでスクリプトを実行しようとしましたが、set
見つかりませんでした。
@JonathanLeffler
—
デズモンドヒューム
/bin/sh -c "set -o pipefail"
は動作しませんが、動作bash -c "set -o pipefail"
します。
だから、あなたの問題は、
—
ジョナサンレフラー
/bin/sh
認識されないスクリプトが実行されることset -o pipefail
です。したがって、スクリプトがの/bin/bash
代わりに実行されることを確認する必要があります/bin/sh
。または、自信がある場合は、勇気があり、おそらく愚かであっ/bin/sh
ても、/bin/bash
現在リンクしているシェルまたはコピーの代わりに、リンクまたはコピーに変更します。そうだと確信している場合/bin/sh
はbash
、次のbash
ように実行したときに公開されない動作を使用してい/bin/sh
ます。bash
として使用しbash
ます。
/bin/sh
好きではありませんset -o pipefail
。それは実際bash
に変装していますか、それとも別のシェルですか?bash
として実行される場合/bin/sh
、受け入れられset -o pipefail
ますか?