Sottoshell standard vs subshell di sostituzione comandi


8

Spiegare questi output trap:

$ 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

Perché la subshell di sostituzione dei comandi si comporta diversamente in quanto afferma di aver ereditato le disposizioni trap (tranne che in realtà non le segue)?

Risposte:


2

Interessante. Questo sembra essere un comportamento specifico di Bash.

Ho provato altre 3 shell compatibili con POSIX (zsh, dash, busybox) e in tutte ho echo "$(trap)"dato lo stesso risultato di (trap): viene eseguita una subshell e la subshell non mostra una EXITtrap.

(Nota che trap -pè specifico di Bash e senza parametri extra fa la stessa cosa trapsenza parametri.)

Il comportamento di Bash è potenzialmente utile : significa che puoi scrivere a="$(trap)"per catturare le impostazioni trap della shell genitore, che hanno più probabilità di essere interessanti.

Tuttavia, se si imposta o cancella una trap nella subshell, verranno elencati i trap della subshell anziché i parent:

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

Quindi hanno anche trattato il raro caso in cui sei interessato alle trappole della subshell.

In generale, ho notato che gli sviluppatori di Bash sembrano aver fatto un ulteriore sforzo per far funzionare bene la gestione delle subshell. È anche molto più semplice gestire i sottoprocessi in background con Bash che con le shell POSIX più minime.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.