Quando você atinge Ctrl-C
, o script em execução obtém SIGINT e o propaga para seus filhos, enquanto na saída "regular" ele envia o SIGTERM padrão (da função registrada com EXIT
).
Dito isso, há uma grande diferença entre Ctrl-C
e a condição de parada. Enquanto a função de manipulador de saída é chamada em ambos os casos, os eventos reais são completamente diferentes. No caso do SIGINT, os processos filhos são mortos por esse (ou pelo menos provavelmente são) e o shell interpretando o script não tem muita chance de relatar essa mudança de estado. No outro caso, ele pega o SIGCHLD dos programas encerrados e exibe a mensagem informativa.
Agora, você também pode receber a mensagem no SIGINT, desde que você tenha tempo suficiente para verificar o shell de interpretação (mais precisamente - já que não acho que o shell esteja deixando processos zumbis nessa situação - para relatar o status de ) seus processos filhos. Uma maneira de fazer isso seria usar o wait
builtin para esperar ativamente por todos ou por processos especificados para alterar o estado. Explodir o manipulador de saída (por exemplo, com outro sleep
) pode ser uma opção também, mas observe que essa é uma condição de corrida entre o intérprete que encerra e verifica seus filhos (portanto, o bloqueio wait
é o caminho seguro fazer isso).