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
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.