如何处理异步子shell退出

如何处理异步子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'

即使子 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 waitbash

相关内容