Jak ustawić pułapkę w funkcjach bash?

13

Mogę skonfigurować trapw skryptach bash, ale nie w funkcjach bash.

Na przykład sourceponiższy kod i uruchom f, a teraz spróbuj Ctrl+ C, nie został uwięziony!

Jak skonfigurować trapfunkcje bash?

  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
źródło
2
Możesz umieścić fna końcu kodu i usunąć spację z f ().
GWF,

Odpowiedzi:

7

To dlatego, że wysyła SIGINT do procesu na pierwszym planie zamiast do bash(który uruchamia skrypt). Jeśli chcesz to zrobić, ustaw funkcję asynchroniczną, a następnie użyj wait(który będzie działał zgodnie z oczekiwaniami i użyje pułapki).

Chris Down
źródło
To trochę działa. Ale odkryłem, że jeśli fjest w rurze echo 123 | f, to nie jest to pułapka?
Cheng,
@Cheng Użyj podpowłoki (a potok w tym przypadku i tak nie jest potrzebny, po prostu użyj heredoc / herestring). (command | command) &
Chris Down,
1

Protip: Wyślij proces pierwszego planu QUIT z Ctrl- \kiedy Ctrl- C, - Z, - Dnie działają.

Usuń pułapki na końcu wykonania za pomocą trap - list of signals here

Zabawa w systemie nieprodukcyjnym: Spróbuj ustawić pułapkę dla wszystkich sensownych sygnałów (np. Nie zabij). kill -l(nie jest to mała litera L, nie numer 1 ani rura |)

Barry A.
źródło
0

Myślę, że powinieneś uczynić tę funkcję globalną

#!/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
źródło
INTi SIGINTsą synonimami - nie będzie to miało znaczenia.
Chris Down,