Bash
為什麼while循環被暫停後會停止?
為什麼使用bash並暫停while循環,循環在恢復後停止?下面的簡短範例。
$ while true; do echo .; sleep 1; done . . ^Z [1]+ Stopped sleep 1 $ fg sleep 1 $
我對信號很熟悉,我猜這可能是 bash 在這裡的自然行為,但我想更好地理解為什麼它會以這種特殊方式執行。
這看起來像是幾個 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 程序。