あるコマンドが失敗した場合、残りのコマンドが実行されなくなるようにする一連のコマンドを実行したいと思います。我々は、命令の順序が次のようであると仮定する。
echo foo
false
echo bar
(つまり、応答を期待しfoo
ますが、応答を期待しませんbar
。)
set -e
これは私が使用するスクリプトで起こるはずです。いいえ上記のコマンドシーケンスが失敗すると、完全な失敗が予想されます。私の最初の考えはサブシェルを使用することでした
( echo foo ; false ; echo bar ; ) || true
しかし、これはうまくいきません。両方とも印刷さfoo
れますbar
。なぜなら、POSIXの仕様によると、set -e
insideの左側が条件付き||
内と同じように効果を失うからです。if
仕様のこの部分は抽象化を破るので概念的に欠陥があると思います。 、しかし、まあ、現在POSIX仕様に変更はありません)。set -e
括弧内に明示的に入れてもこの問題は解決されません。
失敗し、スクリプトが失敗する可能性があるいくつかの代替コマンドを実行したいset +e ... set -e
ので、問題のこの部分を解決することはできません。|| true
(さらに、明示的なset
コマンドを介して状態を復元するのは面倒です。)
したがって、事実の後にset +e
明示的なチェックのみを実行し$?
たり、一連のコマンドを別々のスクリプト(別々のファイルまたは経由bash <<EOF ...
)で実行できるようです。これは(配列)変数に簡単にアクセスできないという欠点があります。
正直なところ、これはかなり日常的なユースケースのように見え、+e
条件として使用される式の左側にある暗黙的および強制は不均衡に驚くほど難しくなります。私が逃した簡単なオプションはありますか?
答え1
最初のコマンドが失敗するまで一連のコマンドを実行するには、次のようにします。
$ command1 && command2 && command3 && command4
&&
トークンは、左コマンドがゼロ終了コードを返す場合にのみ右コマンドを実行します。