SIGINT не очищается в "$ {FUNCNAME }"

Возьмите следующий скрипт, прерванный клавиатурным вводом ^C как показано:

 $ function a() { echo "Performing"; sleep 10; echo "Performed"; } $ a Performing ^C $ echo "${FUNCNAME[@]}" a source 

Если мы повторяем SIGINT во время работы много раз, мы в конечном итоге закончим этот сценарий:

 ... $ a Performing ^C $ a Performing ^C $ echo "${FUNCNAME[@]}" aaaaaaaaa source 

Чтобы продемонстрировать эту проблему, давайте еще одну функцию b , которая дает функцию message_error , также определенную ниже:

 $ function message_error() { > local MESSAGE="$1" > > # FUNCNAME[1], as [0] is `message_error`, gets the calling function > echo "[[ ERROR ]] ${FUNCNAME[1]}: $MESSAGE" > echo "Rest of the stack: ${FUNCNAME[@]}" >} $ function b() { message_error "Oh no"; } $ b [[ ERROR ]] b: Oh no Rest of the stack: message_error baaaaaaaaa source 

Хотя функция вызывается в source , a появляется как вызывающая функция. Как вы можете видеть, все эти функции были завершены. Однако они остаются в массиве FUNCNAME.

Почему это? Как удалить его после того, как SIGINT не удалит его? Обратите внимание, что все функции получены из большой коллекции часто используемых функций ~/.bash_functions , если поиск функций влияет на то, как они интерпретируют SIGINT.

One Solution collect form web for “SIGINT не очищается в "$ {FUNCNAME }"”

Поскольку FUNCNAME является массивом только для чтения , вероятно, нет способа удалить элементы в нем. Кажется, это не работает в unset FUNCNAME , но это также нарушает особенность FUNCNAME от bash.

Предотвращение мусора FUNCNAME можно сделать с помощью trap :

 $ trap : SIGINT $ function a() { echo "Performing"; sleep 10; echo "Performed"; } $ a Performing ^C $ echo %"${FUNCNAME[@]}"% %% 

Чтобы отключить описанную выше профилактику, сделайте trap - SIGINT .

  • Слияние команды с параметром, переданным другой команде
  • Терминальный эмулятор падает с функцией с помощью вложенных операторов case?
  • Что произойдет, если я передам слишком мало параметров функции оболочки?
  • bash: доступ к стеку вызовов функций в функции ловушки
  • Как передать аргумент командной строки в сценарий оболочки?
  • Возврат к ошибке в shellscript вместо выхода при ошибке
  • Скрипт для создания файлов в шаблоне
  • Можно ли добавить функцию внутри функции?
  • что такое контекст подпрограммы?
  • Передача нескольких аргументов в sudo внутри функции
  • Сохранить возвращаемое значение из функции в одном из своих параметров
  • Linux и Unix - лучшая ОС в мире.