各コマンドの最後に|| break
を置くことができますが、break
は0を返しますので、最終的に|| echo "something bad happened"
は実行されません。
break 0
を使用できます。また、break
はゼロ以外のコードで終了しますが、エラーも書き込まれます(リダイレクト可能)。 Gordon Davissonの答えに示すように、エラーコードをグローバル変数に伝播できます。しかし、エラーが返されたコマンドいるあなたを教えてくれない
break_fail() { break 0 2>/dev/null ; }
break_error() { error_code=$? ; break 0 2>/dev/null ; }
error_code=0
while read file; do
command_one_that_might_error_out || break_error
command_two_that_might_error_out || break_error
command_three_that_might_error_out || break_error
done < <(ls -1 .) || echo "something bad happened: Error $error_code"
:
あなたはこの少しきれいにし、あまりにもERROR_CODEをキャプチャする機能でbreak
コマンドを置くことができます。
特定のエラーコードを処理する必要がある場合は、ループ内でインラインで処理し、break_failで中断することをお勧めします。
私はこの抗イディオムはあなたの特別な状況の可能性を除いて、「私は良いシェルプログラマではないよ」叫ぶ怖いですエラーコード1でのみ中断したいが、他のすべてのエラーコードを成功として渡す。 (でも、私は 'case'を使い、ループをリファクタリングしようとします。) – tripleee