O que é o sinal 0 em um comando trap?

12

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

Não entendo por que está capturando o sinal 0. De acordo com o sinal do homem 7, não existe esse sinal.

Isso é apenas um erro de digitação ou erro ou isso realmente alcança alguma coisa?

Christoph Wurm
fonte

Respostas:

19

No manual do bash :

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

... Se um sigspec for EXIT (0), o comando arg será executado na saída do shell.

Esteira
fonte
13
Corrigir. Caso um leitor chegue aqui por causa do título da pergunta, observe que este é o significado de 0um trapcomando shell . Ao enviar um sinal com kill, um número de sinal 0 significa, afinal, não enviar um sinal; essa é uma maneira de testar a existência do processo de destino.
Gilles 'SO- stop be evil'
@ Mat: Muito obrigado. Eu estava lendo uma armadilha para o homem 1 ...
Christoph Wurm
1
Mas não está na lista de saída trap -l!
Amphetamachine
você pode resolver o caso quando o script é originado?
Eric
1

Como o @Mat mostra em sua resposta, um SIGSPEC de 0, quando usado no trapcomando, fará com que o trapcomando 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

Fica aqui esperando indefinidamente. Em outra janela, se agora enviarmos killsinais para ele, você verá que a kill -0não matará o processo, mesmo que o sinal 0 esteja listado no trapcomando.

$ kill -0 $(pgrep tr.bash)
$

No entanto, se killo script usando o sinal 1, kill -1:

$ kill -1 $(pgrep tr.bash)
$

Veremos que o script sai e imprime a mensagem "oi" duas vezes. O primeiro para o sinal 1 e o segundo porque o script saiu.

$ ./tr.bash 
PID: 24086
hi
hi
slm
fonte
0

trap em 0 é executado quando o shell sai. É comumente usado para limpar arquivos tmp em um local que é sempre executado:

tmp = / tmp / myscript. $$

trap 'rm -f $ tmp; saída '0 1 2 15

do_a_bunch_of_stuff

Saída

a saída no final da armadilha sai do shell na limpeza com o status correto.

dbrower
fonte