Ist eine Sub-Shell dasselbe wie eine Child-Shell?

11

Es gibt diese beiden Namen: eine Subshell und eine Child-Shell .

Ja, ein untergeordneter Prozess wird folgendermaßen gestartet:

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

Sind alle gleichwertig und haben denselben Namen? Teilen alle die gleichen Eigenschaften?


POSIX hat diese Definition :

Eine Shell-Ausführungsumgebung besteht aus ....

Der letzte Absatz des obigen Links enthält jedoch Folgendes:

Eine Subshell-Umgebung wird als Duplikat der Shell-Umgebung erstellt, mit der Ausnahme, dass Signalfallen, die nicht ignoriert werden, auf die Standardaktion gesetzt werden.

Und speziell:

Befehlssubstitution, Befehle, die in Klammern gruppiert sind, und asynchrone Listen müssen in einer Subshell-Umgebung ausgeführt werden. Darüber hinaus befindet sich jeder Befehl einer Pipeline mit mehreren Befehlen in einer Subshell-Umgebung. ....

Das sh -c 'echo "Hello"'ist dort nicht enthalten, sollte das auch Subshell genannt werden?

Gilles 'SO - hör auf böse zu sein'
quelle

Antworten:

14

Eine Subshell dupliziert die vorhandene Shell. Es hat die gleichen Variablen¹, die gleichen Funktionen, die gleichen Optionen usw. Unter der Haube wird mit dem forkSystemaufruf² eine Unterschale erstellt ; Der untergeordnete Prozess macht weiter, was von ihm erwartet wird, während der Elternteil wartet (z. B. $(…)) oder sein Leben fortsetzt (z. B. … &) oder auf andere Weise tut, was von ihm erwartet wird (z … | …. B. ).

sh -c …erstellt keine Unterschale. Es startet ein anderes Programm. Dieses Programm ist zufällig eine Hülle, aber das ist nur ein Zufall. Das Programm kann sogar eine andere Shell sein (z. B. wenn Sie sh -c …von Bash aus laufen und shDash ist), dh ein völlig anderes Programm, das zufällig signifikante Ähnlichkeiten in seinem Verhalten aufweist. Unter der Haube shruft das Starten eines externen Befehls ( oder eines anderen) den forkSystemaufruf und dann den execveSystemaufruf auf, um das Shell-Programm im Unterprozess durch ein anderes Programm (hier sh) zu ersetzen .

¹ Einschließlich $$, aber ohne einige Shell-spezifische Variablen wie bash und mksh BASHPID.
² Zumindest ist dies die traditionelle und übliche Implementierung. Muscheln können die Gabel weg optimieren, wenn sie das Verhalten ansonsten nachahmen können.

Relevante Manpages: Fork (2) , Execve (2) .

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank. Wofür gehört das Ausführen eines Bash-Skripts mit Bash Shebang?
Tim
@Tim Gleiches wie sh -c: Das ist ein Unterprozess, der zufällig eine Shell ist.
Gilles 'SO - hör auf böse zu sein'
(1) "Das Starten eines externen Befehls (sh oder eines anderen) ruft den Fork-Systemaufruf und dann den Systemaufruf ausführen auf, um das Shell-Programm im Unterprozess durch ein anderes Programm zu ersetzen (hier sh)." Ist es richtig, dass Fork zuerst eine Subshell erstellt und dann die Subshell durch das externe Programm ersetzt? In den beiden Fällen Ihrer Antwort wird also immer eine Unterschale erstellt? (2) "Eine Subshell, die die vorhandene Shell dupliziert." was bedeutet das?
Tim
(3) In bash -c <command>, nachdem die Shell gegabelt und dann ausgeführt wurde bash -c <command>, wird eine Bash-Shell erstellt. Wird dann der Systemaufruf verwendet, um <command>die Bash-Shell erneut auszuführen und auszuführen <command>?
Tim
2
@cuonglm "Child Shell" ist im Gegensatz zu "Subshell" kein Fachbegriff mit einer bestimmten Bedeutung. Wenn es sich um eine untergeordnete Shell handelt, handelt es sich um eine untergeordnete Shell, die den üblichen englischen Regeln folgt.
Gilles 'SO - hör auf böse zu sein'
1

Eine Sub-Shell-Umgebung muss nicht in einem separaten Prozess ausgeführt werden, sondern lediglich die aktuelle Ausführungsumgebung duplizieren. In ksh93dieser wird von einem getan virtual sub-shellMechanismus, der nicht nennen ist fork(). Dies macht ksh93 auf archaischen Plattformen wie sehr schnell Win-DOS, da Win-DOSes beim Gabeln extrem langsam ist.

sh -c cmd Auf der anderen Seite wird ein neuer Prozess mit der Standard-Shell erstellt, der nicht mit Ihrer aktuellen interaktiven Shell identisch sein muss.

Selbst wenn shund Ihre aktuelle Shell identisch sind, dupliziert dies nicht die Ausführungsumgebung und erstellt daher keine sub-shell.

schily
quelle
Also, in anderen Shells außer ksh93, ist Subshell eine untergeordnete Shell, oder?
Cuonglm
Ich kenne keine andere Implementierung, die heute virtuelle Subshells implementiert.
schily