Ich kann trap
in Bash-Skripten aber nicht Bash-Funktionen einrichten.
Zum Beispiel, source
der Code unten und führen Sie f
, jetzt versuchen Sie Ctrl+ C, es wurde nicht gefangen!
Wie richte trap
ich Bash-Funktionen ein?
4 trap ctrl_c INT
5
6 ctrl_c () {
7 echo "** Trapped CTRL-C"
8 }
9
10
11 f () {
12 for i in `seq 1 100`; do
13 sleep 1
14 echo -n "."
15 done
16 }
f
am Ende Ihres Codes einfügen und das Leerzeichen aus dem entfernenf ()
.Antworten:
Das liegt daran, dass SIGINT im Vordergrund an den Prozess gesendet wird, anstatt an
bash
(der das Skript ausführt). Wenn Sie dies tun möchten, machen Sie die Funktion asynchron und verwenden Sie dannwait
(was sich erwartungsgemäß verhält und die Falle verwendet).quelle
f
ist , wenn es sich in einer Leitungecho 123 | f
befindet?(command | command) &
Protip: Sende dem Vordergrundprozess ein QUIT mit Ctrl- \wenn Ctrl- C, - Z, - Dnicht funktioniert.
Lösche die Fallen am Ende der Ausführung mit
trap - list of signals here
Spaß auf einem nicht produktiven System: Versuchen Sie, eine Falle für alle sensiblen Signale zu setzen (z. B. nicht KILL).
kill -l
(nicht das ist ein Kleinbuchstabe L nicht eine Nummer 1 oder Pipe |)quelle
Ich denke, Sie sollten die Funktion global machen
quelle
INT
undSIGINT
sind auch - es macht keinen unterschied.