Umleitung von rechts nach links in den Codeblock

Umleitung von rechts nach links in den Codeblock

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. rcund Derivate fishunterstü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 ashDerivat 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 shund keines von beiden würde in funktionieren dash.

In dash(oder einer beliebigen shImplementierung) benötigen Sie . cmd | while ...; doneBeachten 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 ( dashmindestens) und aller nachstehenden Zeilenumbruchzeichen) im Speicher gespeichert wird (und ein zusätzliches Zeilenumbruchzeichen wieder hinzugefügt wird).

In jedem Fall,Die Verwendung einer while readSchleife ist oft ein Hinweis darauf, dass Sie den falschen Ansatz wählen., insbesondere wenn es nur um die Textverarbeitung geht.

verwandte Informationen