Che cos'è il segnale 0 in un comando trap?


12

Sto seguendo questa guida su come impostare l'autenticazione SSH senza password con ssh-agent.

Per avviare ssh-agent l'autore consiglia il seguente codice in .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

Non capisco perché intrappoli il segnale 0. Secondo il segnale man 7 non esiste tale segnale.

È solo un errore di battitura o un bug o raggiunge davvero qualcosa?

Risposte:


19

Dal manuale di bash :

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

... Se un sigspec è EXIT (0) il comando arg viene eseguito all'uscita dalla shell.


13
Corretta. Nel caso in cui un lettore venisse qui a causa del titolo della domanda, si noti che questo è il significato di 0in un trapcomando shell . Quando si invia un segnale con kill, un numero di segnale pari a 0 indica di non inviare un segnale dopo tutto; questo è un modo per testare l'esistenza del processo target.
Gilles 'SO- smetti di essere malvagio' il

@Mat: grazie mille. Stavo leggendo l' uomo 1 trappola ...
Christoph Wurm,

1
Ma non è nell'elenco prodotto da trap -l!
anfetamachina,

puoi per favore affrontare il caso quando lo script proviene?
Eric

1

Come mostra @Mat nella sua risposta, un SIGSPEC di 0, se usato sul trapcomando, farà sì che il trapcomando venga eseguito alla chiusura dello script.

Questo esempio illustra cosa succede.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

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

while [ 1 ]; do
    sleep 3
done

Quando eseguiamo questo:

$ ./tr.bash 
PID: 24086

Sta qui ad aspettare indefinitamente. In un'altra finestra se ora inviamo killsegnali ad esso vedrai che a kill -0non ucciderà il processo, anche se il segnale 0 è elencato nel trapcomando.

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

Tuttavia, se abbiamo killlo script utilizzando il segnale 1, kill -1:

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

Vedremo che lo script esce e stampa il messaggio "ciao" 2 volte. Il primo per il segnale 1 e il secondo perché lo script è uscito.

$ ./tr.bash 
PID: 24086
hi
hi

0

trap su 0 viene eseguito all'uscita della shell. È comunemente usato per ripulire i file tmp in un posto che viene sempre eseguito:

tmp = / tmp / myscript. $$

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

do_a_bunch_of_stuff

Uscita

l'uscita alla fine della trappola esce dalla shell durante la pulizia con lo stato corretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.