In Bash Version 4.2.47 (1) -Release, wenn ich versuche, formatierten Text, der aus einem HERE-Dokument stammt, wie folgt zu verketten:
cat <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
) # I want this paranthesis to end the process substitution.
Ich erhalte folgenden Fehler:
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
)
Auch möchte ich das HERE-Dokument nicht zitieren, dh schreiben <'FOOBAR'
, weil ich immer noch Variablen haben möchte, die darin ersetzt werden.
bash
process-substitution
here-document
Tim Friske
quelle
quelle
cat
Anruf wirklich ? Warum nicht beim Anrufen belassenfmt
?(Even
mit"(Even"
es funktioniert. Es ist dasselbe für\(Even
. Sieht aus wie ein Parsing-Bug. Bash ist immer noch in einem Kontext, in dem es nach geschweiften Klammern sucht, während sich beide Kontexte beim Lesen des Dokuments widersprechen.bash
übrigens in 4.3 behoben .Antworten:
Die Prozesssubstitution entspricht in etwa dieser.
Beispiel - Mechanik der Prozesssubstitution
Schritt # 1 - mache ein FIFO, gib es aus
Schritt 2 - Lies das Fifo
Die Verwendung von Parens im HEREDOC scheint ebenfalls in Ordnung zu sein:
Beispiel - nur mit einem FIFO
Schritt 1 - Ausgabe an FIFO
Schritt 2 - Inhalt des FIFO lesen
Ich glaube, Sie stoßen auf das Problem, dass die Prozessersetzung
<(...)
nicht für die Verschachtelung von Parens zu sorgen scheint.Beispiel - Prozess Sub + HEREDOC funktioniert nicht
Es scheint ein wenig zu beruhigen, den Eltern zu entkommen:
Beispiel - Flucht vor Eltern
Aber gibt dir nicht wirklich das, was du willst. Das Gleichgewicht der Eltern scheint auch zu beschwichtigen:
Beispiel - Balancing Parens
Wenn ich komplexe Zeichenfolgen habe, mit denen ich in Bash zu kämpfen habe, werde ich sie fast immer zuerst konstruieren, sie in einer Variablen speichern und sie dann über die Variable verwenden, anstatt zu versuchen, einen kniffligen Liner zu konstruieren, der letztendlich existiert fragil.
Beispiel - Verwenden Sie eine Variable
Dann zum Ausdrucken:
Verweise
quelle
Dies ist nur eine Problemumgehung. Pipe
fmt
tocat
anstelle von Prozessersetzungquelle
bash
Zauberer auf dieser Seite aufschieben . Mein Wissen über Bash-Parser-Interna ist, gelinde gesagt, begrenztDies ist eine alte Frage, und wie Sie feststellen, ist dies ein erfundenes Beispiel (und somit ist die richtige Lösung zu verwenden)
cat |
cat
in diesem Fall " Nein" zu verwenden), werde ich nur meine Antwort für den allgemeinen Fall veröffentlichen. Ich würde es lösen, indem ich es in eine Funktion stecke und diese stattdessen benutze.und dann benutze das
quelle