为什么while循环被挂起后会停止?

bkz*_*and 10 shell bash signals background-process

为什么使用bash并暂停while循环,循环在恢复后停止?下面的简短示例。

$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+  Stopped                 sleep 1
$ fg
sleep 1
$
Run Code Online (Sandbox Code Playgroud)

我熟悉信号,我猜这可能是 bash 的自然行为,但我想更好地理解为什么它会以这种特殊方式表现。

sch*_*ily 10

这看起来像是几个 shell 中的错误,它在ksh93zsh 中按预期工作。

背景:

大多数 shell 似乎在主 shell 内运行 while 循环,并且

如果您使用非登录 shell 键入 ^Z,Bourne Shell 会挂起整个 shell

bash只挂起sleep然后离开 while 循环以支持打印新的 shell 提示

破折号使此命令不可暂停

使用ksh93,事情就大不一样了:

ksh93做同样的事情,虽然命令是第一次启动,但作为sleepksh93 中的一个 buitin,ksh93 有一个处理程序,它导致 while 循环从主 shell 分叉出来,然后在您键入 ^Z 时挂起。

如果您稍后在ksh93 中键入fg,则继续运行仍然运行循环的分叉子。

比较来自 bash 和 ksh93 的作业控制消息时,您会看到主要区别:

bash报告:

[1]+ Stopped sleep 1

ksh93报告:

^Z[1] + Stopped while true; do echo .; sleep 1; done

zsh 的行为类似于ksh93

对于这两个 shell,只要您不键入 ^Z,您就有一个进程(主 shell),并且在您键入 ^Z 之后有两个 shell 进程。