Dans la version 4.2.47(1) de Bash, lorsque j'essaie de caténer du texte formaté provenant d'un document HERE, 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 HERE, c'est-à-dire écrire <'FOOBAR'
, car je veux toujours que des variables y soient substituées.
Réponse acceptée :
La substitution de processus est à peu près équivalente à cela.
Exemple :mécanisme de substitution de processus
Étape 1 – Créer un fifo, le sortir
$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492
Étape 2 : lisez le 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
L'utilisation de parenthèses dans le HEREDOC semble également correcte :
Exemple :utiliser simplement un FIFO
Étape 1 :sortie vers FIFO
$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628
Étape 2 :lire le contenu du FIFO
$ cat /var/tmp/fifo1
(one)
(two
Le problème, je crois que vous rencontrez, est que la substitution de processus, <(...)
, ne semble pas se soucier de l'imbrication des parenthèses en son sein.
Exemple - le processus sub + HEREDOC ne fonctionne pas
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$
Échapper aux parenthèses semble l'apaiser, un peu :
Exemple :parenthèses d'échappement
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
(one)
(two
Mais ne vous donne pas vraiment ce que vous voulez. L'équilibrage des parenthèses semble aussi l'apaiser :
Exemple :équilibrage des parenthèses
$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)
Chaque fois que j'ai des chaînes complexes, comme celle-ci à gérer dans Bash, je les construis 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 finit par être fragilité.
Exemple :utiliser une variable
$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)
Ensuite pour l'imprimer :
$ echo "$var"
(one)
(two
Références
- Remplacement de processus
- Comment puis-je écrire un document ici dans un fichier en script bash ?
- Utilisation des canaux nommés et de la substitution de processus
- Crochets fermants dans les documents Here