Wie richte ich Trap in Bash-Funktionen ein?

13

Ich kann trapin Bash-Skripten aber nicht Bash-Funktionen einrichten.

Zum Beispiel, sourceder Code unten und führen Sie f, jetzt versuchen Sie Ctrl+ C, es wurde nicht gefangen!

Wie richte trapich 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 } 
Cheng
quelle
2
Sie können ein fam Ende Ihres Codes einfügen und das Leerzeichen aus dem entfernen f ().
GWF

Antworten:

7

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 dann wait(was sich erwartungsgemäß verhält und die Falle verwendet).

Chris Down
quelle
Es funktioniert irgendwie. Aber ich habe festgestellt, dass es keine Falle fist , wenn es sich in einer Leitung echo 123 | fbefindet?
Cheng
@Cheng Benutze eine Unterschale (und eine Pipe ist in diesem Fall sowieso nicht nötig, benutze einfach einen Heredoc / Herestring). (command | command) &
Chris Down
1

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 |)

Barry A.
quelle
0

Ich denke, Sie sollten die Funktion global machen

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done
harish.venkat
quelle
INTund SIGINTsind auch - es macht keinen unterschied.
Chris Down