Bash
如何處理非同步子shell退出
說我有這個:
set -e; ( docker stop notifier-server docker rm -f notifier-server exit 1 # explicitly exit with non-zero ) & wait; echo 'we are here now'
即使 subshell 以非零值退出,我們是否總是會到達 echo 行?我假設是這樣,因為它是一個後端程序/子shell?
看待這個問題的正確方法是什麼?
您的程式碼不會終止目前的 shell 會話,因為沒有返回非零退出狀態。啟動後台作業的呼叫 shell 中的結果始終為零。
如果您使用
wait "$!"
或wait -n
(“等待下一個作業完成”),那麼 shell 會話將終止,因為wait
它會返回它等待的作業的退出狀態,該狀態非零。見
help wait
中bash
。
它與程序是否為後台程序無關,它與
wait
命令的退出狀態有關。來自
help wait
:如果沒有給出ID,則等待所有目前活動的子程序,返回狀態為零。
$ bash -exc '(sleep 1; exit 1) & wait ; echo done' + wait + sleep 1 + exit 1 + echo done done
如果提供了 -n 選項,則等待下一個作業終止並返回其退出狀態。
$ bash -exc '(sleep 1; exit 1) & wait -n; echo $?:done' + wait -n + sleep 1 + exit 1