Quando você executa um trabalho em primeiro plano em um shell interativo, somente os processos desse trabalho (no grupo de processos correspondente) recebem o SIGINT (enviado pelo kernel, não pelo shell) sobre ^C
.
Quando não estiver executando nenhum trabalho em primeiro plano, ou seja, no prompt, quando o shell estiver aguardando sua entrada em uma linha de comando, o shell estará em primeiro plano¹. Portanto, pressionar ^C
enviará um sinal SIGINT para o shell, que ele geralmente tratará como cancelando o texto inserido no momento; Ele também pode matar um comando chamado como parte de um widget chave ou de conclusão. Você também pode adicionar seu próprio manipulador lá.
Notas
¹ se o shell foi iniciado como parte do script também executando alguns outros comandos em paralelo, outros processos podem estar no mesmo grupo de processos. Os shells interativos tentarão criar um novo grupo de processos para si mesmos (e torná-lo o primeiro plano) na inicialização, mas poderão não conseguir se o processo já for um líder do grupo de processos. Se você fizer:
bash -c ': <(sleep 1000); exec bash'
E pressione Ctrl + C no prompt desse bash
shell, você notará que sleep
será morto também.
Em: sh -c 'sleep 1000 & exec bash'
, sh
ignoraria SIGINT para o comando sleep
assíncrono (defina a disposição SIGINT como SIGIGN antes de executar sleep
).