假设我有这个:
set -e;
(
docker stop notifier-server
docker rm -f notifier-server
exit 1 # explicitly exit with non-zero
) &
wait;
echo 'we are here now'
即使子 shell 以非零值退出,我们总是会到达 echo 行吗?我想是的,因为它是后端进程/子shell?
怎样看待这个问题才是正确的呢?
答案1
它与进程是否为后台进程无关,它与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
答案2
您的代码不会终止当前的 shell 会话,因为没有返回非零退出状态。启动后台作业的调用 shell 中的结果始终为零。
如果您使用了wait "$!"
or wait -n
(“等待下一个作业完成”),那么 shell 会话会已终止,因为wait
将返回其等待的作业的退出状态,该状态非零。
见于.help wait
bash