Isso parece um bug em vários shells, e funciona como esperado com ksh93 e zsh .
Antecedentes:
A maioria das shells parece rodar o loop while dentro do shell principal e
Bourne Shell suspende todo o shell se você digitar ^ Z com um shell que não seja de login
bash suspende apenas o sleep
e, em seguida, deixa o loop while em favor da impressão de um novo prompt de shell
dash torna este comando inaceitável
Com o ksh93 , as coisas funcionam de maneira muito diferente:
ksh93 faz o mesmo, enquanto o comando é iniciado na primeira vez, mas como sleep
é um buitin em ksh93, ksh93 tem um manipulador que faz com que o loop while seja removido do shell principal e, em seguida, suspender no momento em que você digita ^ Z.
Se você digitar ksh93 mais tarde, digite fg
, o filho bifurcado que ainda executa o loop continuará.
Você vê a principal diferença ao comparar as mensagens do jobcontrol do bash e do ksh93:
bash relatórios:
[1]+ Stopped sleep 1
mas relatórios ksh93 :
^Z[1] + Stopped while true; do echo .; sleep 1; done
zsh se comporta de maneira semelhante a ksh93
Com os dois shells, você tem um único processo (o shell principal), desde que você não digite ^ Z e dois processos de shell depois que você digitou ^ Z.