Interessante. Este parece ser um comportamento específico de Bash.
Eu tentei outros 3 shells compatíveis com POSIX (zsh, dash, busybox), e em todos eles echo "$(trap)"
deu o mesmo resultado que (trap)
: um subshell foi executado, e o subshell não mostra EXIT
armadilha.
(Observe que trap -p
é específico do Bash e, sem parâmetros extras, faz o mesmo que trap
sem parâmetros.)
O comportamento do Bash é potencialmente útil : significa que você pode escrever a="$(trap)"
para capturar as configurações de trap do shell pai, que são mais propensas a serem interessantes.
No entanto, se você definir ou limpar uma armadilha no subshell, então irá listar as armadilhas do subshell ao invés do pai:
$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)" # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
Então eles também abordaram o caso raro em que você está interessado nas armadilhas do subshell.
Em geral, notei que os desenvolvedores do Bash parecem ter feito um esforço extra para fazer o manuseio de subshell funcionar bem. Também é muito mais fácil gerenciar subprocessos de segundo plano com o Bash do que com os shells POSIX mais curtos.