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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top