Restaurar trampas sin un archivo temporal
-
09-12-2019 - |
Pregunta
Sin argumentos trap
imprime la actualidad el conjunto de comandos para todas las trampas.Sin embargo, una subshell no hereda las trampas, por lo que el ejemplo canónico para guardar y restaurar las trampas de la falla en bash:
save_traps=$(trap) ... eval "$save_traps"
La trampa en el lado derecho de la asignación se ejecuta en un subshell, así save_traps siempre es la cadena vacía.Aparte de la escritura de la salida de trap
en un archivo temporal, ¿cómo puede una secuencia de comandos de encontrar el actual conjunto de comandos para que una trampa?
Solución
A mí me funciona.
Crear un ejemplo de trampa:
$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO
La tienda de la trampa en la save_traps
:
$ save_traps=$(trap)
Quitar:
$ trap SIGIO
$ trap | wc -l
0
Restaurar:
$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO
Probado con:
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
Otros consejos
Aunque la página del manual de Bash parece decir que las trampas se restablecen en subshells, y la sustitución de comandos se ejecuta en un subshell, la ejecución de trap
dentro de $()
de todas formas funciona (probado en Bash 3.2 y 4.2).También se menciona en POSIX que traps=$(trap)
debería funcionar.
Gracias a pgas
en #bash
en irc.freenode.net
.