O que é sinal 0 em um comando trap?

10

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?

    
por Christoph Wurm 24.07.2011 / 14:37

3 respostas

17

Do manual do bash :

trap [-lp] [[arg] sigspec ...]

... If a sigspec is EXIT (0) the command arg is executed on exit from the shell.

    
por 24.07.2011 / 14:47
1

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
    
por 25.11.2014 / 20:38
0
O

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.

    
por 05.09.2014 / 19:27