[LINUX] Ausführung durch Subshell (und Variablenaktualisierung)

Hallo. Hier ist eine kurze Zusammenfassung dessen, was passiert, wenn es von einer Subshell ausgeführt wird:

  1. Wenn der Befehl in Klammern "()" [^ 1] eingeschlossen ist.
  2. Vor und nach der Pipeline.
  3. Wenn eine Zeichenfolge / ein Text an einen Shell-Befehl übergeben und ausgeführt wird [^ 2].

Befehlsgruppe

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.

Ausführungsbeispiel nach Subshell

Die Kombination aus Pipeline und Befehlsgruppe war leicht zu missverstehen. Wenn Sie das folgende Beispiel lesen,

command1; command2; { command3; command4; } | { commmand5; command6; }; command7; command8
  1. Was in der Original-Shell ausgeführt wird, ist:
  1. Was in der Subshell ausgeführt wird, ist:

Variablenaktualisierung in der Unterschale

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

$ 

Vermeiden Sie "Variablen in Subshell aktualisieren"

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
$

Verwendung von "Here Document"

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

Ausführung durch Subshell (und Variablenaktualisierung)
Java-Kompilierung und Ausführung von CLI verstanden
Fehler und Abschluss der Ausführung durch LINE [Python] benachrichtigen
Befehlsausführung ausgelöst durch Dateiaktualisierung (Python Edition)
pytube Ausführung und Fehler
Visualisierung von Daten anhand einer erklärenden Variablen und einer objektiven Variablen
[Road to Intermediate Python] Geben Sie die Ausführungsmethode dynamisch anhand des Variablennamens an