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?
sh -c
: Das ist ein Unterprozess, der zufällig eine Shell ist.bash -c <command>
, nachdem die Shell gegabelt und dann ausgeführt wurdebash -c <command>
, wird eine Bash-Shell erstellt. Wird dann der Systemaufruf verwendet, um<command>
die Bash-Shell erneut auszuführen und auszuführen<command>
?Eine Sub-Shell-Umgebung muss nicht in einem separaten Prozess ausgeführt werden, sondern lediglich die aktuelle Ausführungsumgebung duplizieren. In
ksh93
dieser wird von einem getanvirtual sub-shell
Mechanismus, der nicht nennen istfork()
. Dies macht ksh93 auf archaischen Plattformen wie sehr schnellWin-DOS
, daWin-DOS
es 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
sh
und Ihre aktuelle Shell identisch sind, dupliziert dies nicht die Ausführungsumgebung und erstellt daher keinesub-shell
.quelle
ksh93
, ist Subshell eine untergeordnete Shell, oder?