Как настроить ловушку в bash-функциях?

Я могу настроить trap в сценариях bash, но не bash.

Например, source код ниже и запустите f , теперь попробуйте Ctrl + C , он не попал в ловушку!

Как настроить trap в 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 } 

Это потому, что он отправляет SIGINT в процесс на переднем плане, а не в bash (который запускает скрипт). Если вы хотите сделать это, сделайте функцию асинхронной, а затем используйте wait (которая будет действовать так, как ожидалось, и используйте ловушку).

Protip: Отправьте процессу переднего плана QUIT с помощью Ctrl\, когда CtrlC , – Z , – D не работают.

Очистить ловушки в конце выполнения с помощью trap - list of signals here

Веселье в непроизводственной системе: попробуйте установить ловушку для всех разумных сигналов (например, не KILL). kill -l (не это нижний регистр L, а не номер 1 или труба |)

Я думаю, вы должны сделать функцию глобальной

 #!/bin/bash trap ctrl_c INT ctrl_c () { echo "** Trapped CTRL-C" } for i in `seq 1 100`; do sleep 1 echo -n "." done