Linke Seite des Rohres ist die Unterschale?

8

Bearbeiten:

Mein Kommentar bezüglich sed 's@^@ @' <(f1) ist falsch Während $BASH_SUBSHELL anzeigt, dass wir uns auf der gleichen Ebene wie der Start befinden, gehen die Variablen im Hauptskript verloren. basierend auf Gordons Antwort habe ich stattdessen f1 > >(sed 's@^@ @') getestet und das scheint richtig zu funktionieren. Aber sollte nicht BASH_SUBSHELL für das erste Formular 1 und nicht 0 sein?

Betrachten Sie diesen kleinen Test

%Vor%

mit folgender Ausgabe:

%Vor%

(der Zweck von sed ist nur eine Pipe zu etwas zu haben, erwarte nicht, dass es etwas tut, weil f1 an stderr ausgibt)

Die Funktion f1 protokolliert den aktuellen BASH_SUBSHELL und den aktuellen Wert von i

Ich weiß warum am Ende des Skripts i=1 steht, weil der zweite Aufruf in einer Subshell war und der Wert von i in der Subshell 1 verloren ging.

Was ich nicht weiß ist, warum die linke Seite der Pipe in der aktuellen Shell nicht ausgeführt wurde

Obwohl ich dachte, dass ich das mit sed 's@^@ @' <(f1) vermeiden könnte Ich würde gerne wissen, warum die linke Seite nicht auf der gleichen Ebene wie das Hauptscript ist

    
nhed 22.04.2011, 22:22
quelle

2 Antworten

13

Von der Bash-Man-Seite : "Jeder Befehl in einer Pipeline wird als separater Prozess ausgeführt (z. B. in einer Unterschale). " Ich nehme an, es wäre möglich, eine Komponente einer Pipeline in der aktuellen Shell auszuführen (dh die erste oder die letzte oder vielleicht eine in der Mitte), es werden keine Favoriten wie diese abgespielt: sie alle Ausführen in Teilschalen. Wenn Sie Ihr Skript wie folgt ändern:

%Vor%

es druckt:

%Vor%

, weil alle 3 Aufrufe von f1 in der Pipeline in Subshells laufen.

    
Gordon Davisson 22.04.2011, 22:59
quelle
-1

Hier ist ein sehr kurzes Beispiel, wenn sich jemand interessiert:

%Vor%

Oder:

%Vor%

Ja, diese Seite sagt alles

Ссылка Jeder Befehl in einer Pipeline wird als separater Prozess (dh in einer Subshell) ausgeführt.

    
RzR 26.02.2014 22:26
quelle

Tags und Links