Mogę skonfigurować trap
w skryptach bash, ale nie w funkcjach bash.
Na przykład source
poniższy kod i uruchom f
, a teraz spróbuj Ctrl+ C, nie został uwięziony!
Jak skonfigurować trap
funkcje 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 }
f
na końcu kodu i usunąć spację zf ()
.Odpowiedzi:
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żyjwait
(który będzie działał zgodnie z oczekiwaniami i użyje pułapki).źródło
f
jest w rurzeecho 123 | f
, to nie jest to pułapka?(command | command) &
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 |)źródło
Myślę, że powinieneś uczynić tę funkcję globalną
źródło
INT
iSIGINT
są synonimami - nie będzie to miało znaczenia.