Traps ohne temporäre Datei wiederherstellen
-
09-12-2019 - |
Frage
Ohne Argumente trap
gibt die aktuell eingestellten Befehle für alle Traps aus.Eine Subshell erbt jedoch keine Traps, sodass das kanonische Beispiel zum Speichern und Wiederherstellen von Traps in bash fehlschlägt:
save_traps=$(trap) ... eval "$save_traps"
Der Trap auf der rechten Seite der Zuweisung wird in einer Subshell ausgeführt, sodass save_traps immer die leere Zeichenfolge ist.Anders als das Schreiben der Ausgabe von trap
wie kann ein Skript in einer temporären Datei den aktuellen Befehlssatz für einen Trap finden?
Lösung
Funktioniert für mich.
Erstellen einer Probenfalle:
$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO
Lagern Sie die Falle in save_traps
:
$ save_traps=$(trap)
Entfernen:
$ trap SIGIO
$ trap | wc -l
0
Wiederherstellen:
$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO
Getestet mit:
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
Andere Tipps
Obwohl die Bash-Manpage zu sagen scheint, dass Traps in Subshells zurückgesetzt werden und die Befehlsersetzung in einer Subshell ausgeführt wird, wird ausgeführt trap
inneren $()
funktioniert trotzdem (getestet in Bash 3.2 und 4.2).Es wird auch in POSIX erwähnt, dass traps=$(trap)
sollte funktionieren.
Dank pgas
in #bash
an irc.freenode.net
.