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 中的错误,它在ksh93和zsh 中按预期工作。
背景:
大多数 shell 似乎在主 shell 内运行 while 循环,并且
如果您使用非登录 shell 键入 ^Z,Bourne Shell 会挂起整个 shell
bash只挂起sleep
然后离开 while 循环以支持打印新的 shell 提示
破折号使此命令不可暂停
使用ksh93,事情就大不一样了:
ksh93做同样的事情,虽然命令是第一次启动,但作为sleep
ksh93 中的一个 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 进程。