Stellen Sie sich folgendes Szenario vor:
diff file.txt <( cat file.txt | grep -v '^\s*#'| sed '/^$/d' )
Dies ist ein Beispiel für eine Umleitung von rechts nach links, bei der Sie eine Datei verarbeiten und das Ergebnis als Eingabe an umleiten diff
. Ein ähnlicher Anwendungsfall wurde vorgeschlagenHier, was auch gut funktioniert.
Der Versuch, das Ergebnis der Dateiverarbeitung auf ähnliche Weise in einen Codeblock umzuleiten, schlägt jedoch fehl:
while read I; do
…
done <( cat $FIL | <do_something_here> )
Syntax error: "(" unexpected
Oder, wenn Sie dies versuchen:
done < <( cat $FIL | <do_something_here> )
Syntax error: redirection unexpected
Wie leiten Sie die Ausgabe eines Prozesses als Eingabe in einen Codeblock um?
Antwort1
<(...)
Prozesssubstitutionist eine Funktion der Korn-Shell. Sie ist auch in zsh und bash verfügbar. rc
und Derivate fish
unterstützen ebenfalls Prozesssubstitution, jedoch mit einer anderen Syntax, während in der Yash-Shell <(...)
eine Syntax für eine andere Funktion vorliegt:Prozessumleitung.
Der Wortlaut diesesSyntaxfehler: Umleitung unerwartetFehler deutet darauf hin, dass Ihre Shell ein Almquist-Shell-Derivat ist, wie z dash
. AFAIK, wederProzesssubstitutionnochProzessumleitungwurden keinem ash
Derivat hinzugefügt.
while ...; done <(cmd)
würde in funktionieren yash
, while ...; done < <(cmd)
würde in AT&T ksh, zsh und bash funktionieren, aber keines von beiden hat die Standardsyntax sh
und keines von beiden würde in funktionieren dash
.
In dash
(oder einer beliebigen sh
Implementierung) benötigen Sie . cmd | while ...; done
Beachten Sie jedoch dash
, dass in die While-Schleife in einer Sub-Shell ausgeführt wird.
Du könntest es tun:
while ...; done << EOF
$(cmd)
EOF
Beachten Sie jedoch, dass die gesamte Ausgabe cmd
(ohne Berücksichtigung aller NUL-Zeichen ( dash
mindestens) und aller nachstehenden Zeilenumbruchzeichen) im Speicher gespeichert wird (und ein zusätzliches Zeilenumbruchzeichen wieder hinzugefügt wird).
In jedem Fall,Die Verwendung einer while read
Schleife ist oft ein Hinweis darauf, dass Sie den falschen Ansatz wählen., insbesondere wenn es nur um die Textverarbeitung geht.