Hallo. Hier ist eine kurze Zusammenfassung dessen, was passiert, wenn es von einer Subshell ausgeführt wird:
Wenn Sie es zu einer Befehlsgruppe machen (dh in Klammern "{}" einschließen), wird es als einzelne Ausführungseinheit behandelt und in der ursprünglichen Shell wie [^ 3] ausgeführt. Es gibt auch Funktionen und `` `while do ~ done``` [^ 4], um ähnliche Chunks zu verarbeiten.
Die Kombination aus Pipeline und Befehlsgruppe war leicht zu missverstehen. Wenn Sie das folgende Beispiel lesen,
command1; command2; { command3; command4; } | { commmand5; command6; }; command7; command8
command1, command2command7, command8command3, command4command5, command6In Anbetracht der Variablenaktualisierung in der Subshell wird diese nicht an die ursprüngliche Shell weitergegeben. Im folgenden Beispiel ist die Ausgabe von `` `echo $ n``` am Ende leer.
$ unset n; { n=0; printf 'a\nb\n'; } | cat; echo $n
a
b
$ unset n; printf 'a\nb\n' | (n=0; while read -r line; do n=$((n+1)); done; echo $n); echo $n
2
$ unset n; printf 'a\nb\n' | { n=0; while read -r line; do n=$((n+1)); done; echo $n; }; echo $n
2
$
Wenn Sie Variablen in der ursprünglichen Shell aktualisieren, können Sie "Variablen in der Subshell aktualisieren" vermeiden. Das folgende Beispiel ist überfüllt, aber `n = 0``` wird in der ursprünglichen Shell ausgeführt und die Ausgabe des nachfolgenden` echo $ n ist` `0.
$ unset n; { n=0; printf 'a\nb\n' | cat; } ; echo $n
a
b
0
$
Ebenso können Sie das "hier-Dokument" verwenden, um die Variablen in der ursprünglichen Shell zu aktualisieren (Sie können die Pipeline vermeiden). Im folgenden Beispiel ist die Ausgabe von "echo $ n" am Ende "2".
$ unset n; { n=0; while read -r line; do n=$((n+1)); done << EOT
$(printf 'a\nb\n')
EOT
echo $n; }; echo $n
2
2
$
Alternativ können Sie Process Substitution in Bash usw. anstelle der POSIX-Shell verwenden:
$ unset n; { n=0; while read -r line; do n=$((n+1)); done < <(printf 'a\nb\n'); echo $n; }; echo $n
2
2
$
[^ 1]: Das Format von $ (...) , um die Standardausgabe der in Klammern" () "eingeschlossenen Subshell-Ausführung zu erhalten, ist dasselbe. Die Form von `` $ ((...)) `` wird jedoch in der ursprünglichen Shell ausgeführt (" Variationen in der Subshell ").
[^ 2]: Bezieht sich auf ein Ausführungsbeispiel wie das Ausführen eines Shell-Skripts oder `sh -c'n = 0; echo $ n'```. Wenn Sie es dagegen mit dem Befehl `source``` ausführen, wird es in der ursprünglichen Shell ausgeführt.
[^ 3]: Dies ähnelt dem Einschließen in Klammern "()", wird jedoch nicht als Unterschale behandelt.
[^^
Recommended Posts