2011-07-08 14 views
1

ループ内のコマンドのいずれかが返ってきたら、ループしたコードブロックでブレークしてエラーを出したいと思います。私はサブシェルなしでこれをしたいと思います。bashのコードブロックでエラーが発生しました

while read file; do 

    command_one_that_might_error_out; 
    command_two_that_might_error_out; 
    command_three_that_might_error_out; 

done < <(ls -1 .) || echo "something bad when of the commands ran happened"; 

洞察を与えてください。

答えて

1

私はそれをテストしていませんが、これは動作するはずです:

err_val=0 
while read file; do 

    command_one_that_might_error_out || { err_val=$?; break; } 
    command_two_that_might_error_out || { err_val=$?; break; } 
    command_three_that_might_error_out || { err_val=$?; break; } 

done < <(ls -1 .) 

if [ $err_val -ne 0 ]; then 
    echo "something bad happened" 
fi 
0

おそらく最も簡単な方法は、最後のコマンドの戻り値である$?を使用することです。したがって、各コマンドの後に

if [[ "$?" = "1" ]]; then 
    break 
fi 

を追加してください。

+0

私はこの抗イディオムはあなたの特別な状況の可能性を除いて、「私は良いシェルプログラマではないよ」叫ぶ怖いですエラーコード1でのみ中断したいが、他のすべてのエラーコードを成功として渡す。 (でも、私は 'case'を使い、ループをリファクタリングしようとします。) – tripleee

1

お試しスクリプトの先頭にset -eをお試しください。あなたがそれをしている間は、一般的に良いbashの衛生学であるset -uです。

+1

Bash 4.1.5の' man'ページや[Google検索](https://encrypted.google.com/search?q=%22set+-w%22+bash)。おそらく 'pipefail'または' noclobber'を意味しましたか? – l0b0

+0

右のl0b0、私の誤り - 私はPerlの-wと交差受粉しました。 – srking

1

各コマンドの最後に|| 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で中断することをお勧めします。

+0

ありがとうございます。これはとても良いです。私はエラーを渡すものが私にもう少し役立つと思う。私は両方の答えに印を付けることができたらいいなあ – storkk

関連する問題