GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kombiniere ich die Prozesssubstitution von Bash mit dem Here-Dokument?

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
Verwandt:Wie kann überprüft werden, ob der Oracle DB-Prozess in Unix ausgeführt wird und wo Oracle DB installiert ist?
Linux
  1. Wie kombinieren Sie alle Zeilen, die mit einem Backslash-Zeichen enden?

  2. Linux – Wie kombiniere ich den Baum mit der Verzeichnisgröße?

  3. Wie finde ich den Prozess mit maximalen Dateideskriptoren?

  4. So beenden Sie einen Python-Unterprozess, der mit Shell=True gestartet wurde

  5. So kombinieren Sie den Befehl „tar“ mit „find“

So beenden Sie einen Prozess in Linux

So integrieren Sie ONLYOFFICE 9.6 mit WordPress

So sichern Sie Linux-Server mit SE Linux

So arbeiten Sie mit Vordergrund- und Hintergrundprozessen unter Linux

Starten Sie den Prozess unter Linux anhand seiner PID-Nummer mit dem Kill-Befehl neu, wie?

wie man einen Prozess mit hoher Priorität *startet*