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?

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.


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.