Standard-Subshell vs Command-Substitution-Subshell

8

Bitte erläutern Sie diese Trap-Ausgänge:

$ 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

Warum verhält sich die Subshell für die Befehlssubstitution insofern anders, als sie behauptet, die Trap-Dispositionen geerbt zu haben (außer dass sie ihnen nicht tatsächlich folgt)?

PSkocik
quelle

Antworten:

2

Interessant. Dies scheint ein Bash-spezifisches Verhalten zu sein.

Ich habe 3 andere POSIX-kompatible Shells (zsh, dash, busybox) ausprobiert und in allen echo "$(trap)"das gleiche Ergebnis (trap)erzielt wie : Eine Subshell wird ausgeführt, und die Subshell zeigt keine EXITFalle.

(Beachten Sie, dass dies trap -pspezifisch für Bash ist und ohne zusätzliche Parameter dasselbe tut wie trapohne Parameter.)

Das Verhalten von Bash ist möglicherweise nützlich : Es bedeutet, dass Sie schreiben können, a="$(trap)"um die Trap-Einstellungen der übergeordneten Shell zu erfassen, die mit größerer Wahrscheinlichkeit interessant sind.

Wenn Sie jedoch eine Falle in der Unterschale setzen oder löschen, werden die Fallen der Unterschale anstelle der übergeordneten aufgelistet:

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

Sie haben also auch den seltenen Fall behandelt, in dem Sie an den Fallen der Unterschale interessiert sind.

Im Allgemeinen ist mir aufgefallen, dass die Bash-Entwickler anscheinend zusätzliche Anstrengungen unternommen haben, damit die Handhabung von Unterschalen gut funktioniert. Es ist auch viel einfacher, Hintergrund-Unterprozesse mit Bash zu verwalten als mit den minimaleren POSIX-Shells.

Jander
quelle