Quel est le signal 0 dans une command de trap?

Je suis ce guide sur la façon de configurer l'authentification SSH sans mot de passe avec ssh-agent.

Pour démarrer ssh-agent, l'auteur recommand le code suivant dans le .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 

Je ne comprends pas pourquoi il piège le signal 0. Selon le signal de l' homme 7, il n'y a pas un tel signal.

Est-ce juste une faute de frappe ou un bug ou est-ce que cela fait vraiment quelque chose?

Du manuel bash :

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

… Si un sigspec est EXIT (0), la command arg est exécutée à la sortie du shell.

le trap sur 0 est exécuté lorsque le shell sort. Il est couramment utilisé pour nettoyer les files tmp à un endroit qui est toujours exécuté:

tmp = / tmp / myscript. $$

trap 'rm -f $ tmp; sortie '0 1 2 15

do_a_bunch_of_stuff

Sortie

la sortie à la fin du piège sort du shell au nettoyage avec le bon statut.

Comme le montre @Mat dans sa réponse, un SIGSPEC de 0, lorsqu'il est utilisé dans la command trap , entraînera l'exécution de la command trap lors de la sortie du script.

Cet exemple illustre ce qui se passe.

 $ cat tr.bash #!/bin/bash echo "PID: $$" trap 'echo hi; exit 1' 0 1 2 15 while [ 1 ]; do sleep 3 done 

Quand nous courons ceci:

 $ ./tr.bash PID: 24086 

Il est assis ici, attendant indéfiniment. Dans une autre window, si nous envoyons maintenant des signaux kill , vous verrez qu'un kill -0 ne va pas tuer le process, même si le signal 0 est listé dans la command trap .

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

Cependant si on kill le script en utilisant le signal 1, kill -1 :

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

Nous verrons que le script se termine et imprime le message "salut" 2 fois. Le premier pour le signal 1 et le second parce que le script est sorti.

 $ ./tr.bash PID: 24086 hi hi