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


13

Я могу настроить 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 } 

2
Вы можете поставить fв конце своего кода и удалив пробел из f ().
GWF

Ответы:


7

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


Это вроде работает. Но я обнаружил, что если fв трубе echo 123 | f, то это не ловушка?
Ченг

@Cheng Используйте подоболочку (и в этом случае труба в любом случае не нужна, просто используйте heredoc / herestring). (command | command) &
Крис Даун

1

Protip: Отправить процесс переднего плана ВЫЙТИ с Ctrl- \при Ctrl- C, - Z, - Dне работает.

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

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


0

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

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

INTи SIGINTявляются синонимами - это не будет иметь никакого значения.
Крис Даун
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.