Was ist Signal 0 in einem Trap-Befehl?

12

Ich folge dieser Anleitung zum Einrichten der kennwortlosen SSH-Authentifizierung mit ssh-agent.

Um ssh-agent zu starten, empfiehlt der Autor den folgenden Code 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

Ich verstehe nicht, warum es das Signal 0 einfängt. Laut dem Signal von Mann 7 gibt es kein solches Signal.

Ist das nur ein Tippfehler oder ein Fehler oder erreicht dies wirklich etwas?

Christoph Wurm
quelle

Antworten:

19

Aus dem Bash-Handbuch :

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

... Wenn eine Sigspec EXIT (0) ist, wird der Befehl arg beim Beenden der Shell ausgeführt.

Matte
quelle
13
Richtig. Falls ein Leser wegen des Titels der Frage hierher gekommen ist, beachten Sie, dass dies die Bedeutung 0eines Shell- trapBefehls ist. Beim Senden eines Signals mit bedeutet killeine Signalnummer von 0, dass doch kein Signal gesendet wird. Auf diese Weise können Sie die Existenz des Zielprozesses testen.
Gilles 'SO - hör auf böse zu sein'
@ Mat: Vielen Dank. Ich las Mann 1 Falle ...
Christoph Wurm
1
Aber es ist nicht in der Liste von trap -l!
Amphetamachine
Können Sie bitte den Fall ansprechen, wenn das Skript bezogen wird?
Eric
1

Wie @Mat in seiner Antwort zeigt, führt ein SIGSPEC von 0 bei Verwendung des trapBefehls dazu, dass der trapBefehl ausgeführt wird, wenn das Skript beendet wird.

Dieses Beispiel zeigt, was passiert.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

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

while [ 1 ]; do
    sleep 3
done

Wenn wir das ausführen:

$ ./tr.bash 
PID: 24086

Es sitzt hier und wartet auf unbestimmte Zeit. In einem anderen Fenster, wenn wir jetzt killSignale an dieses senden , sehen Sie, dass a kill -0den Prozess nicht abbricht, obwohl Signal 0 im trapBefehl aufgeführt ist.

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

Wenn wir jedoch killdas Skript mit Signal 1 verwenden , kill -1:

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

Wir werden sehen, dass das Skript beendet wird und die Nachricht "hi" zweimal gedruckt wird. Das erste für Signal 1 und das zweite, weil das Skript beendet wurde.

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

Trap on 0 wird ausgeführt, wenn die Shell beendet wird. Es wird häufig verwendet, um tmp-Dateien an einem Ort zu bereinigen, der immer ausgeführt wird:

tmp = / tmp / myscript. $$

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

do_a_bunch_of_stuff

Ausfahrt

Der Ausgang am Ende der Falle verlässt die Shell bei der Bereinigung mit dem richtigen Status.

dbrower
quelle