Una sotto-shell è la stessa cosa di una shell secondaria


11

Ci sono questi due nomi: una subshell e una child-shell .

Sì, un processo figlio verrà avviato da uno di questi:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

Sono tutti equivalenti e condividono lo stesso nome? Tutti condividono le stesse proprietà?


POSIX ha questa definizione :

Un ambiente di esecuzione della shell è costituito da ....

Ma l'ultimo paragrafo del link sopra ha questo:

Un ambiente subshell deve essere creato come duplicato dell'ambiente shell, tranne per il fatto che le trap di segnale che non vengono ignorate devono essere impostate sull'azione predefinita.

E specialmente:

La sostituzione dei comandi, i comandi raggruppati con parentesi e gli elenchi asincroni devono essere eseguiti in un ambiente subshell. Inoltre, ogni comando di una pipeline multi-comando si trova in un ambiente subshell; ....

Non sh -c 'echo "Hello"'è incluso lì, dovrebbe essere chiamato anche una subshell?

Risposte:


14

Una subshell duplica la shell esistente. Ha le stesse variabili¹, le stesse funzioni, le stesse opzioni, ecc. Sotto il cofano, viene creata una subshell con la forkchiamata di sistema²; il processo figlio continua a fare ciò che ci si aspetta da esso mentre il genitore attende (ad es. $(…)) o continua con la sua vita (ad es. … &) o fa comunque ciò che ci si aspetta da esso (ad es … | ….).

sh -c …non crea una subshell. Avvia un altro programma. Quel programma sembra essere una shell, ma è solo una coincidenza. Il programma può anche essere una shell diversa (ad esempio, se si esegue sh -c …da bash, ed shè trattino), ovvero un programma completamente diverso che ha solo somiglianze significative nel suo comportamento. Sotto il cofano, l'avvio di un comando esterno ( sho qualsiasi altro) chiama la forkchiamata di sistema e quindi la execvechiamata di sistema per sostituire il programma shell nel sottoprocesso da un altro programma (qui sh).

¹ Incluse $$, ma escluse alcune variabili specifiche della shell come bash e mksh BASHPID.
² Almeno, questa è l'implementazione tradizionale e normale. Le conchiglie possono ottimizzare la forcella se possono imitare il comportamento altrimenti.

Pagine man pertinenti: fork (2) , execve (2) .


Grazie. A cosa appartiene l'esecuzione di uno script bash con bash shebang?
Tim

@Tim Stessa cosa di sh -c: è un sottoprocesso che per coincidenza sembra essere una shell.
Gilles 'SO- smetti di essere malvagio' il

(1) "l'avvio di un comando esterno (sh o qualsiasi altro) chiama la chiamata di sistema fork e quindi la chiamata di sistema execve per sostituire il programma shell nel sottoprocesso da un altro programma (qui sh)." È corretto che fork crea prima una subshell e quindi esegua la sostituzione della subshell con il programma esterno? Quindi nei due casi nella tua risposta, viene sempre creata una subshell? (2) "Una subshell che duplica la shell esistente." cosa significa?
Tim

(3) in bash -c <command>, dopo aver fork la shell e quindi eseguire bash -c <command>, viene creata una shell bash. Quindi la chiamata di sistema viene utilizzata per eseguire di <command>nuovo fork della shell bash ed eseguire <command>?
Tim

2
@cuonglm "Child shell" non è un termine tecnico con un significato specifico, a differenza di "subshell". Se è una shell che è un bambino, allora è una shell bambino, seguendo le solite regole dell'inglese.
Gilles 'SO- smetti di essere malvagio' il

1

Un ambiente sub-shell non ha bisogno di vivere in un processo separato, deve solo duplicare l'ambiente di esecuzione corrente. In ksh93questo viene fatto da un virtual sub-shellmeccanismo che non chiama fork(). Questo rende ksh93 molto veloce su piattaforme arcaiche come Win-DOS, come Win-DOSè estremamente lento con il fork.

sh -c cmd dall'altro lato crea un nuovo processo con la shell predefinita che non deve necessariamente essere la stessa della shell interattiva corrente.

Anche quando she la tua shell corrente sono identici, questo non duplica l'ambiente di esecuzione e quindi non crea un sub-shell.


Quindi, ad eccezione di altre shell ksh93, subshell è una shell figlio giusto?
cuonglm

Non conosco nessun'altra implementazione che implementa le subshell virtuali oggi.
schily,
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.