Bash trap command


Manchmal möchtest du ein spezielles Signal, eine Unterbrechung oder eine Benutzereingabe in deinem Skript abfangen, um Unvorhersehbares zu verhindern.

trap ist dein Befehl dafür:

  • trap <arg/function> <signal>

Wenn ein Signal empfangen wird, läuft der Befehl oder die Funktion, die als <arg> angegeben wurde. Einige der häufigsten Signaltypen, die du abfangen kannst:

  • SIGINT - der Benutzer sendet ein Unterbrechungssignal (Ctrl + C)
  • SIGQUIT - der Benutzer sendet ein Quitsignal (Ctrl + D)
  • SIGFPE - ein illegaler mathematischer Vorgang wurde versucht

Du kannst alle Signaltypen mit dem folgenden Befehl anzeigen:

kill -l

Beachte die Nummern vor jedem Signalnamen. Du kannst diese Nummer verwenden, um lange Strings in trap zu vermeiden:

# 2 entspricht SIGINT und 15 entspricht SIGTERM
trap booh 2 15

Eine häufige Verwendung von trap ist das Aufräumen von temporären Dateien:

trap "rm -f folder; exit" 2

Hier ist ein vollständiges ausführbares Beispiel. Das Skript setzt einen trap für SIGINT, sendet sich das Signal selbst, und der Handler läuft:

#!/bin/bash
trap 'echo "Caught SIGINT"' SIGINT
echo "before kill"
kill -SIGINT $$
echo "after kill"

Dies gibt aus:

before kill
Caught SIGINT
after kill

Exercise

Korrigiere den trap-Handler unten so, dass er statt TODO: replace me den Text Bye! ausgibt, wenn SIGINT empfangen wird.


Copyright © learnshell.org. Read our Terms of Use and Privacy Policy