Denken Sie daran, dass die gewählte Antwort lautet bashism
, was Lösung als bedeutet
trap "{ rm -f $LOCKFILE }" EXIT
würde nur in bash funktionieren (es wird Strg + c nicht abfangen, wenn Shell dash
oder klassisch ist sh
), aber wenn Sie Kompatibilität wünschen, müssen Sie immer noch alle Signale auflisten, die Sie abfangen möchten.
Denken Sie auch daran, dass beim Beenden des Skripts die Falle für das Signal "0" (auch bekannt als EXIT) immer ausgeführt wird, was zu einer doppelten Ausführung des trap
Befehls führt.
Das ist der Grund, nicht alle Signale in einer Zeile zu stapeln, wenn es ein EXIT-Signal gibt.
Zum besseren Verständnis sehen Sie sich das folgende Skript an, das ohne Änderungen auf verschiedenen Systemen funktioniert:
#!/bin/sh
on_exit() {
echo 'Cleaning up...(remove tmp files, etc)'
}
on_preExit() {
echo
echo 'Exiting...' # Runs just before actual exit,
# shell will execute EXIT(0) after finishing this function
# that we hook also in on_exit function
exit 2
}
trap on_exit EXIT # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR # 1 2 3 15 30
sleep 3 # some actual code...
exit
Diese Lösung gibt Ihnen mehr Kontrolle, da Sie einen Teil Ihres Codes beim Auftreten des tatsächlichen Signals kurz vor dem endgültigen Beenden ( preExit
Funktion) ausführen können und bei Bedarf Code beim tatsächlichen EXIT-Signal (letzte Stufe des Beenden) ausführen können.