In der Bash-Version 4.2.47(1)-Release, wenn ich versuche, formatierten Text zu verketten, der aus einem HERE-Dokument kommt, wie folgt:
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 die folgende Fehlermeldung:
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, also <'FOOBAR'
schreiben , weil ich immer noch Variablen haben möchte, die darin ersetzt werden.
Akzeptierte Antwort:
Die Prozesssubstitution ist ungefähr äquivalent dazu.
Beispiel – Mechanik der Prozesssubstitution
Schritt #1 – Fifo erstellen, dorthin ausgeben
$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492
Schritt #2 – Fifo lesen
$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+ Done fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1
Die Verwendung von Klammern innerhalb des HEREDOC scheint auch in Ordnung zu sein:
Beispiel – nur mit einem FIFO
Schritt #1 – Ausgabe an FIFO
$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628
Schritt #2 – Inhalt des FIFO lesen
$ cat /var/tmp/fifo1
(one)
(two
Ich glaube, das Problem, auf das Sie stoßen, ist, dass die Prozesssubstitution <(...)
, scheint sich nicht um die Verschachtelung von Eltern darin zu kümmern.
Beispiel – Prozess sub + HEREDOC funktioniert nicht
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$
Das Entkommen der Klammern scheint es ein wenig zu besänftigen:
Beispiel – Escaping von Parens
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
(one)
(two
Aber gibt dir nicht wirklich das, was du willst. Das Ausbalancieren der Eltern scheint es auch zu besänftigen:
Beispiel – Eltern ausgleichen
$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)
Wann immer ich mit komplexen Strings wie dieser 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 Einzeiler zu erstellen, der am Ende ist zerbrechlich.
Beispiel – Verwenden Sie eine Variable
$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)
Dann zum Ausdrucken:
$ echo "$var"
(one)
(two
Referenzen
- Prozesssubstitution
- Wie kann ich ein Here-Dokument im Bash-Skript in eine Datei schreiben?
- Verwendung von Named Pipes und Prozesssubstitution
- Schließende Klammern in Here-Dokumenten