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)?

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.