Subshell padrão versus subshell de substituição de comando

8

Por favor explique estas saídas de armadilha:

$ 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 que a subcamada de substituição de comando se comporta de maneira diferente no sentido de que ela herdou as disposições da armadilha (exceto que ela não as segue de fato)?

    
por PSkocik 17.04.2016 / 16:29

1 resposta

2

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.

    
por 26.04.2016 / 06:14

Tags