このスクリプトを実行しようとしています。
#!/bin/bash -e
{
echo "Doing something";
will_fail # like `false`
echo "Worked";
} || echo "Failed"
驚いたことにwill_fail
失敗しましたが、コマンドラインに「失敗」が表示されずに「動作」しました。
失敗後に複合コマンドがエラーなしで終了するのはなぜですかwill_fail
?
ベストアンサー1
Failed
複合コマンドの終了ステータスは、で実行された最後のコマンドの終了ステータスであるため、印刷されません{ ...; }
。echo
Successecho
なので、複合コマンドは終了状態 0 で終了します。
次は3つの文字列を出力します。
{ echo "Do something"; echo "Worked"; false; } || echo "Failed"
~からPOSIX規格:
特に明記しない限り、コマンドの終了ステータスは、そのコマンドによって実行された最後の単純コマンドの終了ステータスです。
ここではさまざまなことが起こっています(要約)。
あなたは
set -e
積極的に走っています。コマンドがゼロ以外の終了状態を返す場合(代替として)、シェルは終了します。ただし、コマンドは(リストの一部であるwill_fail
複合コマンド)の一部であるため(そしてリストの最後のコマンドではないため)、これには適用されません。||
また、POSIX規格(私のハイライト):
予約語の後に、、、、または複合リストを実行するとき
-e
、予約語で始まるパイプ、またはwhile
until
if
elif
!
どんな命令でも最後の項目を除くAND-ORのリスト。リストの最後の簡単なコマンド
||
はですecho "Failed"
。これは、複合コマンドの完全終了状態を決定します。正常に実行されたため(そしてwill_fail
シェルが終了していないため)、状態はゼロになり、これは反対側の端が||
実行されないことを意味します。