Dans la version 4.2.47 (1) de Bash, relâchez lorsque j'essaie de caténaliser du texte formaté qui provient d'un ICI-découment comme ceci:
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.
J'obtiens l'erreur suivante:
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
)
De plus, je ne veux pas citer le document ICI, c'est-à-dire écrire <'FOOBAR'
, car je veux toujours que des variables y soient substituées.
bash
process-substitution
here-document
Tim Friske
la source
la source
cat
appel? Pourquoi ne pas le laisser appelerfmt
?(Even
avec"(Even"
cela fonctionne. C'est pareil pour\(Even
. On dirait un bug d'analyse. Bash est toujours dans un contexte où il cherche des accolades tout en étant également dans le contexte de la lecture du document ici et les deux contextes se contredisent.bash
4.3, soit dit en passant.Réponses:
La substitution de processus est à peu près équivalente à cela.
Exemple - mécanique de substitution de processus
Étape # 1 - Créez un fifo, éditez-le
Étape # 2 - Lisez le fifo
L'utilisation de parens au sein de l'HEREDOC semble également correcte:
Exemple - en utilisant simplement un FIFO
Étape # 1 - sortie vers FIFO
Étape # 2 - lire le contenu de FIFO
Le problème, je crois que vous vous heurtez, est que la substitution de processus
<(...)
ne semble pas se soucier de l'imbrication des parens en son sein.Exemple - processus sub + HEREDOC ne fonctionne pas
Échapper aux parens semble l'apaiser un peu:
Exemple - échapper aux parens
Mais ne vous donne pas vraiment ce que vous voulez. Équilibrer les parens semble également l'apaiser:
Exemple - équilibrage des parens
Chaque fois que j'ai des chaînes complexes, comme celle-ci avec Bash, je les construirai presque toujours en premier, en les stockant dans une variable, puis en les utilisant via la variable, plutôt que d'essayer de créer une doublure délicate qui finira par être fragile.
Exemple - utilisez une variable
Puis pour l'imprimer:
Les références
la source
Ceci est juste une solution de contournement. Diriger
fmt
verscat
au lieu d'utiliser la substitution de processusla source
bash
assistants de ce site. Ma connaissance des internes de l'analyseur bash est pour le moinsCeci est une vieille question, et comme vous vous rendez compte que c'est un exemple artificiel (et donc que la bonne solution est d'utiliser
cat |
ou en fait, aucuncat
du tout dans ce cas), je vais simplement poster ma réponse pour le cas général. Je le résoudrais en le mettant dans une fonction et en l'utilisant à la place.puis l'utiliser
la source