Primeiro, um resumo de alguns fatos sobre sinais e o shell:
-
Quando você pressiona CTRL + C no teclado, uma SIGINT é enviada para todos os processos no grupo de processos do processo em primeiro plano. Nesse caso, significa que um SIGINT será recebido pelo comando
cat
e pelo processobash
que interpreta seu script. -
Quando você interceptar
INT
, umINT
não fará mais com que o processo seja encerrado, a menos que você saia explicitamente em seu manipulador. -
Quando você captura
EXIT
, seu argumento é executado não em um sinal específico, mas na saída do shell.
O comportamento de trapping-int.sh
é direto, dados esses fatos, pois sabemos que acontece o seguinte:
- O processo
cat
recebe um SIGINT e sua execução é finalizada. - O processo
bash
recebe um SIGINT e executa seu manipulador de sinal, imprimindo "Saindo \ n" paraSTDOUT
. - O processo
bash
continua a execução e imprime "Olá \ n" paraSTDOUT
. - O processo
bash
é encerrado quando chega ao final do script.
O comportamento de trapping-exit.sh
também é bastante direto:
- O processo
cat
recebe um SIGINT e sua execução é finalizada. - O processo
bash
recebe um SIGINT e, como não há manipulador de sinal, ele também sai. Ele executa / não / executa o comandoecho
, pois está saindo imediatamente após receber o sinal. - Como o processo
bash
está sendo finalizado, o manipuladorEXIT
é executado, imprimindo "Exiting \ n" paraSTDOUT
.
A questão restante é "de onde vem a nova linha?" Acredito que o que está acontecendo é que o próprio bash está instalando um manipulador SIGINT
que imprime uma nova linha.
No seu script trapping-int.sh
, você substitui o manipulador do Bash por SIGINT
, para que você não receba a nova linha extra.