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, command2
command7, command8
command3, command4
command5, command6
In 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