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.

  • Каковы команды для поиска ключевых слов оболочки, встроенных функций и пользовательских функций?
  • Сохранить возвращаемое значение из функции в одном из своих параметров
  • Как использовать ssh в функции (bash)?
  • Как вызвать функцию уровня ядра в пользовательском пространстве
  • Скрипт для создания файлов в шаблоне
  • Как ссылаться на скрипт-локальный словарь в сопоставлении Vim?
  • Использование команды break в качестве аргумента функции
  • Запуск исполняемого файла в PATH с тем же именем, что и существующая функция
  • 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 .

    Linux и Unix - лучшая ОС в мире.