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 os trata como SIGINT.
Tanto o manual do ksh quanto o manual do bash justificam ignorar o SIGTERM nestes termos:
para que kill 0
não mate um shell interativo
kill 0
mata todos os processos no grupo de processos em que o shell está¹. 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 segundo plano ou trabalho suspenso.
Mais precisamente, é isso o que acontece nas conchas modernas com controle de trabalho . Nessas conchas, kill 0
não seria útil, pois o shell estaria em um grupo de processos próprio. Os shells mais antigos (ou shells modernos depois set +m
) não criaram grupos de processos para comandos em segundo plano. Portanto, você pode usar o comando kill 0
para eliminar todos os comandos em segundo plano sem desconectar-se kill 0
.
No entanto, existem outras situações semelhantes nas quais tornar a concha imune é útil. Considere o caso em que você possui processos que monopolizam um terminal e deseja matá-los sem sair do sistema. Muitos sistemas possuem uma ferramenta como a pkill
qual permite matar os processos em execução em um terminal. Você pode executar pkill -t $TTY
ou pkill -QUIT -t $TTY
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 o sai (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 logoff de uma sessão X, kill -15 -1
será feito, pois mata o emulador de terminal que faz com que o shell receba o SIGHUP. De fato, é suficiente matar o servidor X, mas isso exige encontrar seu ID do processo. Se você deseja que o mesmo comando funcione em uma sessão de texto, você pode usá-lo kill -15 -1; exit
. É um comando muito perigoso de ter ao seu alcance de qualquer maneira.
Seem Isso não parece ser mencionado nos manuais do shell como regra; é um recurso da chamada do sistema subjacente. É mencionado explicitamente na especificação POSIX .
² Atualmente, para fazer isso, execute jobs -l
a exibição de uma lista de tarefas com o ID do grupo de processos e depois kill -123 -456 …
mate os grupos de processos.
/bin/kill
ou o shell embutido? Neste último caso, estou supondo que o shell não se mate com seu próprio componente.