Intéressant. Cela semble être un comportement spécifique à Bash.
J'ai essayé 3 autres shells compatibles POSIX (zsh, dash, busybox), et dans chacun d'eux a echo "$(trap)"
donné le même résultat que (trap)
: un sous-shell est exécuté, et le sous-shell ne montre pas de EXIT
piège.
(Notez que cela trap -p
est spécifique à Bash, et sans paramètres supplémentaires, il fait la même chose trap
qu'avec aucun paramètre.)
Le comportement de Bash est potentiellement utile : cela signifie que vous pouvez écrire a="$(trap)"
pour capturer les paramètres d'interruption du shell parent, qui sont plus susceptibles d'être intéressants.
Toutefois, si vous définissez ou d' effacer un piège dans le sous - shell, il sera la liste des pièges du sous - shell au lieu de celle du parent:
$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)" # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
Ils ont donc également couvert le cas rare où vous êtes intéressé par les pièges du sous-shell.
En général, j'ai remarqué que les développeurs de Bash semblent avoir fait un effort supplémentaire pour que la gestion des sous-shells fonctionne bien. Il est également beaucoup plus facile de gérer les sous-processus d'arrière-plan avec Bash qu'avec les shells POSIX les plus minimaux.