为什么这个bash脚本结束时会终止调用进程?

为什么这个bash脚本结束时会终止调用进程?

当运行此 bash 脚本时有背景的,它终止调用 shell。为什么是这样?

#!/bin/bash
#
# weird job control, background termination of parent shell problem
set -eum
echo "Do not go gentle into that good night"
sleep 1

将其另存为wat,,chmod +x wat运行它wat- 没问题。运行有背景的:

wat &

它会关闭我当前的外壳!?更奇怪的是,如果最后一条睡眠线被注释掉,它可以非常愉快地在后台运行。谁能解释一下吗?

我知道这与-m(作业控制)选项有关,set但我不明白为什么......

答案1

如果脚本使用 Bash 4.3.30 运行,但不使用 Bash 4.4.12 运行,我可以看到这种情况发生。 (运行脚本的 shell 版本似乎并不那么重要。)

我没有进一步一分为二,但里面有这个变更日志看起来它可能适用:

This document details the changes between this version, bash-4.4-rc1, and
the previous version, bash-4.4-beta.

i.  Fixed a bug that caused background processes run from non-interactive shells
    with job control enabled to place the terminal in the wrong process group
    under certain circumstances.

答案2

来自男人:

-m 监视模式。

作业控制已启用。对于支持它的系统上的交互式 shell,此选项默认处于启用状态(请参阅上面的作业控制)。后台进程在单独的进程组中运行,并在完成时打印包含其退出状态的行。

来自安全日志:

收到与 XXXX 的断开连接:0

看来,如果我们设置为 -m,则在后台进程完成后,退出状态将打印在当前 shell 上exit 0。能够在 securelog 中见证。

相关内容