Restaurer les interruptions sans fichier temporaire
-
09-12-2019 - |
Question
Sans arguments trap
imprime les commandes actuellement définies pour tous les pièges.Cependant, un sous-shell n'hérite pas des traps, donc l'exemple canonique de sauvegarde et de restauration des traps échoue dans bash :
save_traps=$(trap) ... eval "$save_traps"
Le piège sur le RHS de l'affectation s'exécute dans un sous-shell, donc save_traps est toujours la chaîne vide.Outre l'écriture de la sortie de trap
dans un fichier temporaire, comment un script peut-il trouver la commande actuelle définie pour un piège ?
La solution
Travaille pour moi.
Créez un exemple de piège :
$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO
Rangez le piège dans save_traps
:
$ save_traps=$(trap)
Retirer:
$ trap SIGIO
$ trap | wc -l
0
Restaurer:
$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO
Testé avec :
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
Autres conseils
Bien que la page de manuel de Bash semble indiquer que les pièges sont réinitialisés dans les sous-shell et que la substitution de commandes est exécutée dans un sous-shell, l'exécution trap
à l'intérieur $()
fonctionne quand même (testé dans Bash 3.2 et 4.2).Il est également mentionné dans POSIX que traps=$(trap)
devrait marcher.
Grâce à pgas
dans #bash
à irc.freenode.net
.