Sous-shell standard vs sous-shell de substitution de commande

8

Veuillez expliquer ces sorties de piège:

$ line(){ echo -------------; echo $BASHPID; }
$ trap 'echo bye' EXIT; trap -p; line; (trap -p; line); echo "$(trap -p; line)"

trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6176
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6178
trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6180

Pourquoi le sous-shell de substitution de commandes se comporte-t-il différemment en ce qu'il prétend avoir hérité des dispositions de piège (sauf qu'il ne les suit pas réellement)?

PSkocik
la source

Réponses:

2

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 EXITpiège.

(Notez que cela trap -pest spécifique à Bash, et sans paramètres supplémentaires, il fait la même chose trapqu'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.

Jander
la source