GNU/Linux >> Linux Esercitazione >  >> Linux

Come combinare la sostituzione del processo di Bash con Here-document?

In Bash versione 4.2.47(1)-release quando provo a concatenare il testo formattato che proviene da un documento HERE in questo modo:

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.

Ottengo il seguente errore:

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
)

Inoltre non voglio citare il documento QUI, cioè scrivere <'FOOBAR' , perché voglio comunque che le variabili vengano sostituite al suo interno.

Risposta accettata:

La sostituzione del processo è più o meno equivalente a questo.

Esempio – meccanica di sostituzione del processo

Passaggio n. 1:crea un fifo, invialo in output

$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492

Passaggio n. 2:leggi il fifo

$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+  Done                    fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1

Anche l'uso delle parentesi all'interno dell'HEREDOC sembra OK:

Esempio:utilizzando solo una FIFO

Passaggio n. 1:output su FIFO

$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628

Fase #2:leggi i contenuti di FIFO

$ cat /var/tmp/fifo1
(one)
(two

Il problema, credo che tu stia riscontrando, è che la sostituzione del processo, <(...) , non sembra preoccuparsi della nidificazione dei genitori al suo interno.

Esempio – processo sub + HEREDOC non funzionano

$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$

Sfuggire ai genitori sembra placarlo, un po':

Esempio:sfuggire ai genitori

$ cat <(fmt --width=10 <<FOO                 
(one)
(two
FOO
)
(one)
(two

Ma non ti dà davvero quello che vuoi. Rendere equilibrati i genitori sembra anche placarlo:

Esempio:bilanciare i genitori

$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)

Ogni volta che ho stringhe complesse, come questa con cui confrontarmi in Bash, quasi sempre le costruirò prima, memorizzandole in una variabile, e poi le userò tramite la variabile, piuttosto che provare a creare una fodera complicata che finisce per essere fragile.

Esempio:usa una variabile

$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)

Quindi per stamparlo:

$ echo "$var"
(one)
(two

Riferimenti

  • Sostituzione del processo
  • Come posso scrivere un documento here in un file nello script bash?
  • Utilizzo di Named Pipe e sostituzione di processo
  • Chiudere le parentesi in qui documenti
Correlati:come verificare se il processo Oracle DB è in esecuzione in Unix e dove è installato Oracle DB?
Linux
  1. Come si combinano tutte le righe che terminano con un carattere barra rovesciata?

  2. Perché la sostituzione del processo Bash non funziona con alcuni comandi?

  3. Linux:come combinare l'albero con la dimensione della directory?

  4. Rsync ~/foo Target/foo è uguale a Rsync ~/foo/ Target/foo/?

  5. Come terminare un processo <defunct> con il genitore 1

Come uccidere un processo in Linux

Come integrare ONLYOFFICE 9.6 con WordPress

Come proteggere i server Linux con SE Linux

Come lavorare con il processo in primo piano e in background in Linux

come *avviare* un processo con un'alta priorità

Come configuro monit per avviare un processo con un utente specifico?