Bash - 2つのコマンドを実行し、最初のコマンドが失敗した場合は終了ステータス1を取得します。

Bash - 2つのコマンドを実行し、最初のコマンドが失敗した場合は終了ステータス1を取得します。

次の場合、reportコマンドは常に実行する必要がありますが、コマンドが失敗した場合は終了ステータス1を取得する必要がありますtest

test;report
echo $?
0

シェルスクリプトを作成せずに単一のbash行でこれを行うにはどうすればよいですか?

答え1

保存して再利用してください$?

test; ret=$?; report; exit $ret

テストコマンドが複数あり、すべて実行したいが、そのうちの1つが失敗したかどうかを追跡するには、bashのERRトラップを使用できます。

failures=0
trap 'failures=$((failures+1))' ERR
test1
test2
if ((failures == 0)); then
  echo "Success"
else
  echo "$failures failures"
  exit 1
fi

答え2

シェルコマンドを含むファイルに加えて、シェルスクリプトとは何ですか?シェルスクリプトではなくふりをすることができますそして次のように1行で入力してください。

(test; r=$?; report; [ "$r" -gt 0 ] && exit 1; exit 0)

最初のコマンド1です。以外を返すと、サブシェルを終了します。0それ以外の場合はを返します0

たとえば、実際のプログラムを実行するのではなく、何かをエコーし​​ます。

$ (false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
1
$ (true; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
0
$ # example with an exit-status of 2:
$ (grep foo bar; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
grep: bar: No such file or directory
report
$ echo $?
1

シェルオプションを定期的に設定する場合は、errexitサブシェルが早期に終了しないようにオーバーライドを追加する必要があります。

(set +o errexit; false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)

答え3

「コマンドが失敗したら状態1で終了test」と言われました。このような区別をしようとすると(つまり、testコマンドが 2 または 3 で終了しても終了値が 1 になりたい場合など)、次は良い解決策です。

test && { report; true; } || { report; false; }

実際に「1」を意味するわけではありませんが、終了コード全体testでゼロ以外の値が終了した場合、現在の最良の回答($?保存と再利用)は正常に機能します。

答え4

これは本当に悪い考えですが、効果があるようでインスピレーションを得ることもできます。

(trap report exit; test)

関連情報