Do manual do bash :
trap [-lp] [[arg] sigspec ...]
... If a sigspec is EXIT (0) the command arg is executed on exit from the shell.
Estou seguindo este guia sobre como configurar a autenticação SSH sem senha com o ssh-agent.
Para iniciar o ssh-agent, o autor recomenda o seguinte código em .bash_profile
:
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
eval '$SSHAGENT $SSHAGENTARGS'
trap "kill $SSH_AGENT_PID" 0
fi
Eu não entendo porque é o sinal de captura 0. De acordo com o sinal do homem 7 não existe sinal.
Isso é apenas um erro de digitação ou bug ou isso realmente alcança alguma coisa?
Do manual do bash :
trap [-lp] [[arg] sigspec ...]
... If a sigspec is EXIT (0) the command arg is executed on exit from the shell.
Como @Mat mostra em sua resposta, um SIGSPEC de 0, quando usado no comando trap
fará com que o comando trap
seja executado quando o script sair.
Este exemplo ilustra o que acontece.
$ cat tr.bash
#!/bin/bash
echo "PID: $$"
trap 'echo hi; exit 1' 0 1 2 15
while [ 1 ]; do
sleep 3
done
Quando executamos isso:
$ ./tr.bash
PID: 24086
Ele fica aqui esperando indefinidamente. Em outra janela, se enviarmos agora kill
sinais para ele, você verá que kill -0
não eliminará o processo, mesmo que o sinal 0 esteja listado no comando trap
.
$ kill -0 $(pgrep tr.bash)
$
No entanto, se kill
do script usar sinal 1, kill -1
:
$ kill -1 $(pgrep tr.bash)
$
Veremos que o script sai e imprime a mensagem "hi" duas vezes. O primeiro para o sinal 1 e o segundo porque o script saiu.
$ ./tr.bash
PID: 24086
hi
hi
trap em 0 é executado quando o shell sai. É comumente usado para limpar arquivos tmp em um lugar que é sempre executado:
tmp=/tmp/myscript.$$
trap 'rm -f $tmp; exit' 0 1 2 15
do_a_bunch_of_stuff
exit
a saída no final da interceptação sai do shell na limpeza com o status correto.