¿Qué es la señal 0 en un comando trap?

12

Estoy siguiendo esta guía sobre cómo configurar la autenticación SSH sin contraseña con ssh-agent.

Para iniciar ssh-agent, el autor recomienda el siguiente código en .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

No entiendo por qué está atrapando la señal 0. Según la señal del hombre 7, no hay tal señal.

¿Es solo un error tipográfico o un error o esto realmente logra algo?

Christoph Wurm
fuente

Respuestas:

19

Del manual de bash :

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

... Si un sigspec es EXIT (0), el comando arg se ejecuta al salir del shell.

Estera
fuente
13
Correcto. En caso de que un lector viniera aquí por el título de la pregunta, tenga en cuenta que este es el significado de 0un trapcomando de shell . Al enviar una señal con kill, un número de señal de 0 significa no enviar una señal después de todo; Esta es una forma de probar la existencia del proceso objetivo.
Gilles 'SO- deja de ser malvado'
@ Mat: Muchas gracias. Estaba leyendo la trampa del hombre 1 ...
Christoph Wurm
1
¡Pero no está en la lista de salida por trap -l!
anfetamachine
¿puede abordar el caso cuando se obtiene el script?
Eric
1

Como muestra @Mat en su respuesta, un SIGSPEC de 0, cuando se usa en el trapcomando, hará que el trapcomando se ejecute cuando salga el script.

Este ejemplo ilustra lo que sucede.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

trap 'echo hi; exit 1' 0 1 2 15

while [ 1 ]; do
    sleep 3
done

Cuando ejecutamos esto:

$ ./tr.bash 
PID: 24086

Se sienta aquí esperando indefinidamente. En otra ventana, si ahora le enviamos killseñales, verá que a kill -0no matará el proceso, a pesar de que la señal 0 aparece en el trapcomando.

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

Sin embargo, si utilizamos killel script con la señal 1 kill -1:

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

Veremos que el guión sale e imprime el mensaje "hola" 2 veces. El primero para la señal 1, y el segundo porque salió el script.

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

trap en 0 se ejecuta cuando el shell sale. Se usa comúnmente para limpiar archivos tmp en un lugar que siempre se ejecuta:

tmp = / tmp / myscript. $$

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

do_a_bunch_of_stuff

salida

la salida al final de la trampa sale del shell en la limpieza con el estado correcto.

dbrower
fuente