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

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

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

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

  • Bash: Итерирование 2 списков с использованием одиночного цикла In In
  • Изменение пустой строковой переменной внутри оператора switch в функции bash
  • Bash: самый быстрый способ определения размеров изображения из URL-адреса
  • быстро сравнить значения в текстовом файле
  • как CentOS загружает файл bash_alias?
  • Сценарий Bash не может перемещать файлы
  •  ... $ 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.

  • Как я могу узнать, был ли запущен исполняемый скрипт bash с -x для отладки?
  • Извлечь два значения из вывода команды
  • Как удалить все файлы с определенным расширением в определенной папке?
  • Строка Bash заменяет несколько символов одним
  • Как я могу выбрать один из результатов поиска и разрешить его открытие с помощью указанного приложения
  • Тест -n дает неожиданный результат
  • 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 - лучшая ОС в мире.