次の場合、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)