当运行此 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 中见证。