Восстановление ловушек без временного файла
-
09-12-2019 - |
Вопрос
Без аргументов trap
печатает текущие установленные команды для всех ловушек.Однако подоболочка не наследует ловушки, поэтому канонический пример сохранения и восстановления ловушек в bash не работает:
save_traps=$(trap) ... eval "$save_traps"
Ловушка в правой части присваивания выполняется в подоболочке, поэтому save_traps всегда является пустой строкой.Помимо записи вывода trap
во временный файл, как сценарий может найти текущий набор команд для ловушки?
Решение
Работает для меня.
Создайте образец ловушки:
$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO
Храните ловушку в save_traps
:
$ save_traps=$(trap)
Удалять:
$ trap SIGIO
$ trap | wc -l
0
Восстановить:
$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO
Протестировано с:
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
Другие советы
Хотя на странице руководства Bash, кажется, говорится, что ловушки сбрасываются в подоболочках, а подстановка команд выполняется в подоболочке, выполняя trap
внутри $()
работает в любом случае (протестировано в Bash 3.2 и 4.2).В POSIX также упоминается, что traps=$(trap)
должно сработать.
Благодаря pgas
в #bash
в irc.freenode.net
.