Qu'est-ce que le signal 0 dans une commande trap?

12

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 recommande le code suivant dans .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.

S'agit-il simplement d'une faute de frappe ou d'un bug ou est-ce que cela permet vraiment d'atteindre quelque chose?

Christoph Wurm
la source

Réponses:

19

Du manuel bash :

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

... Si une sigspec est EXIT (0), la commande arg est exécutée à la sortie du shell.

Tapis
la source
13
Correct. Dans le cas où un lecteur viendrait ici à cause du titre de la question, notez que c'est le sens de 0dans une trapcommande shell . Lors de l'envoi d'un signal avec kill, un numéro de signal de 0 signifie ne pas envoyer de signal après tout; c'est une façon de tester l'existence du processus cible.
Gilles 'SO- arrête d'être méchant'
@Mat: Merci beaucoup. Je lisais le piège de l'homme 1 ...
Christoph Wurm
1
Mais ce n'est pas dans la liste sortie par trap -l!
amphetamachine
pouvez-vous s'il vous plaît aborder le cas lorsque le script est d'origine?
Eric
1

Comme @Mat le montre dans sa réponse, un SIGSPEC de 0, lorsqu'il est utilisé sur la trapcommande, provoquera l' trapexécution de la commande à la fin 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

Lorsque nous exécutons ceci:

$ ./tr.bash 
PID: 24086

Il attend ici indéfiniment. Dans une autre fenêtre, si nous lui envoyons maintenant des killsignaux, vous verrez qu'un kill -0ne tuera pas le processus, même si le signal 0 est répertorié dans la trapcommande.

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

Cependant, si nous killle script 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
slm
la source
0

trap on 0 est exécuté lorsque le shell se termine. Il est couramment utilisé pour nettoyer les fichiers tmp en un seul 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 quitte la coquille au nettoyage avec le bon état.

broyeur
la source