Bash

如何處理非同步子shell退出

  • July 7, 2019

說我有這個:

set -e;

(
   docker stop notifier-server
   docker rm -f notifier-server
   exit 1  # explicitly exit with non-zero
) &

wait;

echo 'we are here now'

即使 subshel​​l 以非零值退出,我們是否總是會到達 echo 行?我假設是這樣,因為它是一個後端程序/子shell?

看待這個問題的正確方法是什麼?

您的程式碼不會終止目前的 shell 會話,因為沒有返回非零退出狀態。啟動後台作業的呼叫 shell 中的結果始終為零。

如果您使用wait "$!"wait -n(“等待下一個作業完成”),那麼 shell 會話終止,因為wait它會返回它等待的作業的退出狀態,該狀態非零。

help waitbash

它與程序是否為後台程序無關,它與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

引用自:https://unix.stackexchange.com/questions/527352