Subshell estándar vs subshell de sustitución de comandos

8

Por favor explique estas salidas de trampa:

$ 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

¿Por qué el subshell de sustitución de comandos se comporta de manera diferente en el sentido de que afirma haber heredado las disposiciones de la trampa (excepto que en realidad no las sigue)?

PSkocik
fuente

Respuestas:

2

Interesante. Esto parece ser un comportamiento específico de Bash.

Probé otros 3 shells compatibles con POSIX (zsh, dash, busybox), y en todos ellos echo "$(trap)"obtuve el mismo resultado que (trap): se ejecuta un subshell y el subshell no muestra una EXITtrampa.

(Tenga en cuenta que trap -pes específico de Bash, y sin parámetros adicionales hace lo mismo que trapsin parámetros).

El comportamiento de Bash es potencialmente útil : significa que puede escribir a="$(trap)"para capturar la configuración de trampa del shell principal, que es más probable que sea interesante.

Sin embargo, si se establece o se borra una trampa en el subnivel, entonces se va a enumerar las trampas de la subshell en lugar de los padres de:

$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)"  # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

Así que también han cubierto el raro caso en el que estás interesado en las trampas de la subshell.

En general, he notado que los desarrolladores de Bash parecen haber hecho un esfuerzo extra para hacer que el manejo de subshell funcione bien. También es mucho más fácil administrar subprocesos en segundo plano con Bash que con los shells POSIX más mínimos.

Jander
fuente