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.

  • Синтаксис Ошибка рядом с Неожиданным токеном в определении функции bash
  • Как получить имя текущего буфера в emacs?
  • Использование «@» в качестве имени функции bash
  • Какие оболочки имеют функции, где «local» не изменяет экспортированные переменные для дочерних процессов?
  • Выполнение простой математики в командной строке с использованием функций bash: $ 1, деленная на $ 2 (используя, возможно, bc)
  • Функция Bash присваивает значение переданному параметру
  • Префикс каждого аргумента с -o в BASH
  • Что означает «(8)» в fsck (8)?
  • 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 .

    Interesting Posts

    Драйвер для датчика действительности 138a: 0018

    Удаленный прямой рендеринг для GLX (OpenGL)

    Предоставление некоторым пользователям только SSH и доступа к оболочке с ограниченным использованием ресурсов

    Как я могу убедиться, что сценарий запущен исключительно?

    Вывод «дерева» с «чистым» (7-разрядным) выходом ASCII

    Как переопределить адрес электронной почты, используемый командой

    Как отключить оптическую мышь usb от терминала Ubuntu 14.04?

    Flashplugin все еще использует mms.cfg?

    SSSD для аутентификации и SAMBA для совместного использования файлов

    Почему я не могу создать файл сценария из .xsessionrc?

    Настройка изображения для i3-lock: «Не удалось загрузить изображение x: из памяти»

    Powercuts и сетевые адаптеры!

    найти и конвейер grep ничего не возвращает

    Как создать загрузочный образ Windows 8 iso в Linux?

    Есть ли программное обеспечение для Debian для исправления моего GRUB

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