Bash erlaubt zu verwenden: cat <(echo "$FILECONTENT")
Bash erlaubt auch zu verwenden: while read i; do echo $i; done </etc/passwd
Um die beiden vorherigen zu kombinieren, kann Folgendes verwendet werden: echo $FILECONTENT | while read i; do echo $i; done
Das Problem mit dem letzten ist, dass es eine Sub-Shell erstellt und nach dem Ende der while-Schleife i
nicht mehr auf die Variable zugegriffen werden kann.
Meine Frage ist:
Wie erreiche while read i; do echo $i; done <(echo "$FILECONTENT")
ich so etwas: oder mit anderen Worten: Wie kann ich sicher sein, dass i
die while-Schleife überlebt?
Bitte beachten Sie, dass mir das Einfügen der while-Anweisung in bekannt ist {}
, dies das Problem jedoch nicht löst (stellen Sie sich vor, Sie möchten die while-Schleife in der Funktion und die Rückgabevariable verwenden i
).
quelle
lastpipe
und ihrer Vor- und Nachteile.Antworten:
Die korrekte Notation für Process Substitution lautet:
Der letzte
i
in der Schleife zugewiesene Wert ist dann verfügbar, wenn die Schleife endet. Eine Alternative ist:Die geschweiften Klammern sind eine E / A-Gruppierungsoperation und erstellen selbst keine Unterschale. In diesem Zusammenhang sind sie Teil einer Pipeline und werden daher als Subshell ausgeführt. Dies liegt jedoch an der
|
, nicht an der{ ... }
. Sie erwähnen dies in der Frage. AFAIK, Sie können innerhalb dieser innerhalb dieser Funktion eine Rückkehr durchführen.Bash bietet auch das
shopt
eingebaute und eine seiner vielen Optionen ist:Wenn Sie also so etwas in einem Skript verwenden, wird das Modifizierte
sum
nach der Schleife verfügbar:Wenn Sie dies in der Befehlszeile tun, wird normalerweise die Jobsteuerung nicht aktiv ausgeführt (dh in der Befehlszeile ist die Jobsteuerung aktiv). Das Testen ohne Verwendung eines Skripts ist fehlgeschlagen.
Wie Gareth Rees in seiner Antwort feststellte , können Sie manchmal auch eine Hier-Zeichenfolge verwenden :
Dies erfordert nicht
shopt
; Möglicherweise können Sie einen Prozess damit speichern.quelle
while read i; do echo $i; done < <(cat /etc/passwd); echo $i
die letzte Zeile nicht zweimal zurückgegeben. Was mache ich falsch?i
auf leer zurückgesetzt wird, sodass das Echo nach der Schleife eine leere Zeile wiedergibt.while read i; do x=$i; done < <(cat /etc/passwd); echo i=$i; echo x=$x
funktioniert, // vielleicht hat sich das Bash-Verhalten in diesen Tagen geändert?Jonathan Leffler erklärt, wie Sie mithilfe der Prozessersetzung das tun, was Sie möchten. Eine andere Möglichkeit besteht darin, eine Here-Zeichenfolge zu verwenden :
Dies spart einen Prozess.
quelle
Diese Funktion dupliziert $ NUM-Zeiten von JPG-Dateien (Bash)
quelle