您可以在每個命令的末尾放置|| break
,但break
返回0,因此您的最終|| echo "something bad happened"
將不會執行。
您可以使用break 0
和break
將以非零代碼退出,但它也會寫入一個錯誤(可能會重定向)。您可以通過一個全局變量傳播錯誤代碼,如Gordon Davisson的答案所示。
你可以在一個函數把break
命令,使這個少許清潔劑並捕獲ERROR_CODE太:
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"
這並不是告訴你哪些命令,雖然返回的錯誤。
如果你需要處理特定的錯誤代碼,我建議在循環中內聯處理它們並用break_fail打破。
這恐怕反成語尖叫「我不是一個好殼的程序員」,用的情況下,可能是個例外,你專只想在錯誤代碼1上打破,但將所有其他錯誤代碼作爲成功傳遞。 (即使這樣,我會使用'case',並且/或者嘗試重構循環。) – tripleee