Primeiro, isso não é específico para o bash. ATT ksh, dash e zsh se comportam da mesma maneira: eles ignoram SIGTERM e SIGQUIT durante a edição da linha de comando; quanto ao mksh, ele também não sai mas trata-os como SIGINT.
Tanto o manual do ksh quanto o manual do bash justificam ignorar o SIGTERM nestes termos:
so that
kill 0
does not kill an interactive shell
kill 0
mata todos os processos no grupo de processos que o shell está em. Em poucas palavras, o grupo de processos consiste em todos os processos em execução em primeiro plano em um terminal ou em todos os processos em um plano de fundo ou em um trabalho suspenso.
Mais precisamente, é isso que acontece nos shells modernos com controle de trabalho . Em tais shells, kill 0
não seria útil, pois o shell estaria em um grupo de processos próprio. Conchas mais antigas (ou shells modernas depois de set +m
) não criavam grupos de processos para comandos em segundo plano. Assim, você poderia usar o comando kill 0
para matar todos os comandos de segundo plano sem sair do site.² Assim, o kill 0
rationale parece um antigo que não é mais justificado atualmente, mas mantido para compatibilidade com versões anteriores.
No entanto, existem outras situações semelhantes em que tornar o shell imune é útil. Considere o caso em que você tem processos monopolizando um terminal e quer matá-los sem ter logado. Muitos sistemas têm uma ferramenta como pkill
que permite eliminar os processos em execução em um terminal. Você pode executar pkill -t $TTY
ou pkill -QUIT -t $TTY
para eliminar todos os processos em execução no terminal atual, exceto o shell que ignora o sinal.
Um shell normalmente desaparece quando o usuário sai dele (com um comando como exit
ou logout
) ou quando seu terminal sinaliza o final da entrada (o usuário pode causar isso pressionando Ctrl). + D ) ou desaparece completamente. Neste último caso, o shell recebe o sinal SIGHUP, e não o ignora.
Para o seu caso de uso de logout de uma sessão X, kill -15 -1
irá fazê-lo, já que ele mata o emulador de terminal que faz com que o shell receba SIGHUP. Na verdade, é suficiente matar o servidor X, mas isso requer encontrar seu ID de processo. Se você quiser que o mesmo comando funcione em uma sessão de texto, use kill -15 -1; exit
. Isso é um comando bastante perigoso para ter na ponta dos dedos de qualquer maneira.
¹ Isto não parece ser mencionado nos manuais de shell como regra; é um recurso da chamada do sistema subjacente. É mencionado explicitamente na especificação POSIX .
² Atualmente, para fazer isso, execute jobs -l
para ver uma lista de jobs com seus IDs de grupos de processos, e então kill -123 -456 …
para eliminar os grupos de processos.