Por que, usando o bash e suspendendo um loop while, o loop para após ser retomado? Pequeno exemplo abaixo.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
Estou familiarizado com os sinais e acho que esse pode ser o comportamento natural do bash, mas gostaria de entender melhor por que ele se comporta dessa maneira específica.
bash
shell
signals
background-process
bkzland
fonte
fonte
$?
retorno, e assimtrue
não étrue
. provavelmente. eu acho que.Respostas:
Parece um bug em vários shells, funciona como esperado com o ksh93 e o zsh .
Fundo:
A maioria das conchas parece executar o loop while dentro do shell principal e
O Bourne Shell suspende o shell inteiro se você digitar ^ Z com um shell sem login
o bash suspende apenas o
sleep
e depois deixa o loop while em favor da impressão de um novo prompt de shello traço torna este comando não suspenso
Com o ksh93 , as coisas funcionam de maneira muito diferente:
O ksh93 faz o mesmo, enquanto o comando é iniciado pela primeira vez, mas como
sleep
ocorre no ksh93, o ksh93 possui um manipulador que faz com que o loop while bifurque o shell principal e suspenda no momento em que você digita ^ Z.Se você digitar mais tarde o ksh93
fg
, o filho bifurcado que ainda executa o loop será continuado.Você vê a principal diferença ao comparar as mensagens de controle de tarefas do bash e do ksh93:
relatórios do bash :
[1]+ Stopped sleep 1
mas o ksh93 informa:
^Z[1] + Stopped while true; do echo .; sleep 1; done
O zsh se comporta de maneira semelhante ao ksh93
Nos dois shells, você tem um único processo (o shell principal), desde que não digite ^ Z, e dois processos de shell após digitar ^ Z.
fonte
dash
realmente não processa o sinal quando o loop termina? no[d]?ash
código fonte, existem todas essas macros para INTON e INTOFF dispersas por todo o corpo , e normalmente os sinais recebidos enquanto estão no estado INTOFF são realmente manipulados (ou ao redor) por INTON . de qualquer forma, estou curioso porque acho que você sabe melhor - é uma ótima resposta. obrigado.sleep 100
pode ser suspenso e retomadodash
, portanto, parece que eledash
conhece os problemas desse comando e desativa seletivamente o controle do trabalho.dash
o desempenho de outros shells ao eliminar o processamento multibyte? e sim,dash
suporta o controle do trabalho, mas o padrão diz que um shell interativo deve ignorar o TSTP, e executar um loop while no shell atual em um terminal interativo não é menos um shell interativo do que qualquer outro.Eu escrevi um dos co-autores de Bash sobre o assunto, e aqui está sua resposta:
Portanto, se alguém quiser enviar um patch, use os endereços de email encontrados nas páginas de manual.
fonte