Bash

為什麼while循環被暫停後會停止?

  • August 26, 2018

為什麼使用bash並暫停while循環,循環在恢復後停止?下面的簡短範例。

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

我對信號很熟悉,我猜這可能是 bash 在這裡的自然行為,但我想更好地理解為什麼它會以這種特殊方式執行。

這看起來像是幾個 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 程序。

引用自:https://unix.stackexchange.com/questions/245674