场地小
\n\n我经常使用子 shell 来执行涉及更改Shell 执行环境的操作,以免影响主 shell。我经常从交互式 shell 中执行此操作,有时也从脚本中执行此操作。
\n\n启用或禁用作业控制当然是这些操作之一,无论出于何种原因,当需要精细控制进程分组时,我一直在随意使用此功能。
\n\n然而,作为 Bash 用户,我注意到这种自由在最新版本中得到了加强:直到 v4.3,作业控制才被允许并在交互式子 shell 中完全工作,但自 v4.4 以来就不再这样了。在那里,它仍然可以在交互式子 shell 中使用,但不能完全工作(见下文)。它在脚本内仍然可以很好地工作,但是,自 v5 以来,至少一个作业控制的特定用例(即 的细粒度处理Ctrl+C)已经更加严格,使其只能从脚本内的子 shell 内进行管理..!
\n\n因此,我开始产生怀疑,因此花了一些时间对一些常见的 shell 进行了示例综合测试,所有这些测试都是在 Ubuntu 19.04 上使用其测试 shell 的库存(和发行版更新)版本执行的。
\n\n一些背景
\n\n我注意到bash, yash, mksh, 和zshdo Honorset -m在子 shell 中,而dash和kshdo 则没有。ksh即使在测试结束时被拦住也很奇怪。
TL; DR:接下来是我刚才所说的漫长的演示会议:
\n\n$ bash -c \'echo start; (set -bm; …Run Code Online (Sandbox Code Playgroud)