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