Einführung
Ein Shell-Skript kann während seiner Ausführung auf Probleme stoßen, was zu einem Fehlersignal führt, das das Skript unerwartet unterbricht.
Fehler treten aufgrund eines fehlerhaften Skriptdesigns, Benutzeraktionen oder Systemausfällen auf. Ein fehlgeschlagenes Skript kann temporäre Dateien hinterlassen, die Probleme verursachen, wenn ein Benutzer das Skript neu startet.
Dieses Tutorial zeigt Ihnen, wie Sie die trap
verwenden Befehl, um sicherzustellen, dass Ihre Skripts immer vorhersehbar beendet werden.

Voraussetzungen
- Zugriff auf das Terminal/die Befehlszeile.
- Ein Texteditor (Nano, Vi/Vim usw.).
Bash-Trap-Syntax
Die Syntax für trap
Befehl ist:
trap [options] "[arguments]" [signals]
Der Befehl hat die folgenden Komponenten:
- Optionen bieten zusätzliche Funktionalität für den Befehl.
- Argumente sind die Befehle
trap
wird ausgeführt, wenn ein Signal erkannt wird. Sofern der Befehl nicht nur aus einem Wort besteht, sollte er in Anführungszeichen gesetzt werden (" "
). Wenn das Argument mehr als einen Befehl enthält, trennen Sie diese mit einem Semikolon (;
). - Signale sind vom System gesendete asynchrone Benachrichtigungen, die normalerweise auf eine benutzergenerierte oder systembedingte Unterbrechung hinweisen. Signale können mit ihrem Namen oder ihrer Nummer aufgerufen werden.
Bash-Trap-Optionen
Die trap
Der Befehl akzeptiert die folgenden Optionen:
-p
- Zeigt Signalbefehle an.-l
- Druckt eine Liste aller Signale und ihrer Nummern.
Nachfolgend finden Sie die vollständige Liste der 64 Signale und ihrer Nummern:
# | Signal | # | Signal | # | Signal |
---|---|---|---|---|---|
1 | SIGHUP | 23 | SIGURG | 45 | SIGRTMIN+11 |
2 | SIGNAL | 24 | SIGXCPU | 46 | SIGRTMIN+12 |
3 | SIGQUIT | 25 | SIGXFSZ | 47 | SIGRTMIN+13 |
4 | Siegel | 26 | SIGVTALRM | 48 | SIGRTMIN+14 |
5 | SIGTRAP | 27 | SIGPROF | 49 | SIGRTMIN+15 |
6 | SIGABRT | 28 | SIGWINCH | 50 | SIGRTMAX-14 |
7 | SIGBUS | 29 | SIGIO | 51 | SIGRTMAX-13 |
8 | SIGFPE | 30 | SIGPWR | 52 | SIGRTMAX-12 |
9 | SIGKILL | 31 | SIGSYS | 53 | SIGRTMAX-11 |
10 | SIGUSR1 | 32 | SIGWAITING | 54 | SIGRTMAX-10 |
11 | SIGSEGV | 33 | SIGLWP | 55 | SIGRTMAX-9 |
12 | SIGUSR2 | 34 | SIGRTMIN | 56 | SIGRTMAX-8 |
13 | SIGPIPE | 35 | SIGRTMIN+1 | 57 | SIGRTMAX-7 |
14 | SIGALRM | 36 | SIGRTMIN+2 | 58 | SIGRTMAX-6 |
15 | SIGTERM | 37 | SIGRTMIN+3 | 59 | SIGRTMAX-5 |
16 | SIGSTKFLT | 38 | SIGRTMIN+4 | 60 | SIGRTMAX-4 |
17 | SIGCHLD | 39 | SIGRTMIN+5 | 61 | SIGRTMAX-3 |
18 | SIGCONT | 40 | SIGRTMIN+6 | 62 | SIGRTMAX-2 |
19 | SIGSTOP | 41 | SIGRTMIN+7 | 63 | SIGRTMAX-1 |
20 | SIGTSTP | 42 | SIGRTMIN+8 | 64 | SIGRTMAX |
21 | SIGTTIN | 43 | SIGRTMIN+9 | ||
22 | SIGTTOU | 44 | SIGRTMIN+10 |
Die Signale, die am häufigsten mit der trap
verwendet werden Befehle sind:
SIGHUP (1)
- Sauberes AufräumenSIGINT (2)
- UnterbrechungSIGQUIT (3)
- BeendenSIGABRT (6)
- AbbrechenSIGALRM (14)
- WeckerSIGTERM (15)
- Beenden
Wie man Trap in Bash verwendet
Ein typisches Szenario für die Verwendung der trap
Befehl fängt das SIGINT
ab Signal. Dieses Signal wird vom System gesendet, wenn der Benutzer die Ausführung des Skripts durch Drücken von Strg+C unterbricht .
Das folgende Beispielskript gibt das Wort „Test aus " jede Sekunde, bis der Benutzer sie mit Strg+C unterbricht . Das Skript gibt dann eine Nachricht aus und wird beendet.
trap "echo The script is terminated; exit" SIGINT
while true
do
echo Test
sleep 1
done
Das while
Schleife im obigen Beispiel wird unendlich ausgeführt. Die erste Zeile des Skripts enthält die trap
Befehl und die Anweisung, auf den SIGINT
zu warten signalisieren, dann die Nachricht drucken und das Skript beenden.

Die trap
Der Befehl wird häufig verwendet, um temporäre Dateien zu bereinigen, wenn das Skript aufgrund einer Unterbrechung beendet wird. Das folgende Beispiel definiert die cleanup
Funktion, die eine Meldung ausgibt, entfernt alle Dateien, die zu $TRASH
hinzugefügt wurden Variable und beendet das Skript.
$TRASH=$(mktemp -t tmp.XXXXXXXXXX)
trap cleanup 1 2 3 6
cleanup()
{
echo "Removing temporary files:"
rm -rf "$TRASH"
exit
}
...
Die trap
führt im obigen Beispiel die cleanup
aus Funktion, wenn es eines der vier Signale erkennt:SIGHUP
, SIGINT
, SIGQUIT
, oder SIGABRT
. Die Signale werden mit ihrer Nummer bezeichnet.
Sie können auch trap
verwenden um sicherzustellen, dass der Benutzer die Skriptausführung nicht unterbrechen kann. Diese Funktion ist wichtig, wenn sensible Befehle ausgeführt werden, deren Unterbrechung das System dauerhaft beschädigen kann. Die Syntax zum Deaktivieren eines Signals lautet:
trap "" [signal]
Doppelte Anführungszeichen bedeuten, dass kein Befehl ausgeführt wird. Zum Beispiel, um SIGINT
abzufangen und SIGABRT
geben Sie Folgendes ein:
trap "" SIGINT SIGABRT
[a command that must not be interrupted]
Wenn Sie die Signale zu irgendeinem Zeitpunkt während des Skripts wieder aktivieren möchten, setzen Sie die Regeln zurück, indem Sie das Bindestrich-Symbol verwenden:
trap - SIGINT SIGABRT
[a command that can be interrupted]