Co to jest sygnał 0 w poleceniu trap?

12

Postępuję zgodnie z tym przewodnikiem, jak skonfigurować uwierzytelnianie SSH bez hasła za pomocą ssh-agent.

Aby uruchomić ssh-agent, autor zaleca następujący kod w .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

Nie rozumiem, dlaczego to sygnał pułapki 0. Według sygnału człowieka 7 takiego sygnału nie ma.

Czy to tylko literówka lub błąd, czy naprawdę coś to osiąga?

Christoph Wurm
źródło

Odpowiedzi:

19

Z podręcznika bash :

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

... Jeśli sigspec to EXIT (0), polecenie arg jest wykonywane przy wyjściu z powłoki.

Mata
źródło
13
Poprawny. W przypadku, gdy czytelnik przybył tutaj z powodu tytułu pytania, zauważ, że jest to znaczenie polecenia 0powłoki trap. Wysyłając sygnał za pomocą kill, liczba 0 oznacza w końcu, że nie należy wysyłać sygnału; jest to sposób na sprawdzenie istnienia procesu docelowego.
Gilles „SO- przestań być zły”
@ Mat: Wielkie dzięki. Czytałem pułapkę 1 człowieka ...
Christoph Wurm
1
Ale nie ma go w liście wyjściowej trap -l!
amfetamachina
czy możesz zająć się sprawą, gdy skrypt jest pozyskiwany?
Eric
1

Jak pokazuje @Mat w swojej odpowiedzi, SIGSPEC równy 0, gdy zostanie użyty w trappoleceniu, spowoduje uruchomienie trappolecenia po zakończeniu skryptu.

Ten przykład ilustruje, co się dzieje.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

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

while [ 1 ]; do
    sleep 3
done

Kiedy to uruchomimy:

$ ./tr.bash 
PID: 24086

Siedzi tutaj i czeka w nieskończoność. W innym oknie, jeśli teraz wyślemy killdo niego sygnały, zobaczysz, że a kill -0nie zabije procesu, nawet jeśli sygnał 0 jest wymieniony w trappoleceniu.

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

Jednak jeśli mamy killskrypt za pomocą sygnału 1 kill -1:

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

Zobaczymy, że skrypt kończy działanie i wypisuje komunikat „cześć” 2 razy. Pierwszy dla sygnału 1, a drugi, ponieważ skrypt zakończył działanie.

$ ./tr.bash 
PID: 24086
hi
hi
slm
źródło
0

pułapka na 0 jest uruchamiana po wyjściu powłoki. Jest powszechnie używany do czyszczenia plików tmp w jednym miejscu, które jest zawsze wykonywane:

tmp = / tmp / myscript. $$

trap 'rm -f $ tmp; wyjście „0 1 2 15

do_a_bunch_of_stuff

wyjście

wyjście na końcu pułapki wychodzi ze skorupy podczas czyszczenia o odpowiednim statusie.

dbrower
źródło