Як налаштувати пастку у функціях 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 до процесу на передньому плані замість до bash(який працює під сценарієм). Якщо ви хочете це зробити, зробіть функцію асинхронною, а потім використовуйте wait(що буде діяти так, як очікувалося, і використовуйте пастку).


Це вид роботи. Але я виявив, що якщо fв трубі echo 123 | f, то це не пастка?
Ченг

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

1

Підказка: Надішліть процес переднього плану QUIT з 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.