GNU/Linux >> Tutoriels Linux >  >> Linux

Comment combiner la substitution de processus de Bash avec Here-document ?

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
Connexe :Comment vérifier si le processus Oracle DB est en cours d'exécution sous Unix et où Oracle DB est installé ?
Linux
  1. Pourquoi la substitution de processus Bash ne fonctionne-t-elle pas avec certaines commandes ?

  2. Linux - Comment combiner l'arborescence avec la taille du répertoire ?

  3. Est-ce que Rsync ~/foo Target/foo est identique à Rsync ~/foo/ Target/foo/?

  4. Comment trouver le processus avec un maximum de descripteurs de fichiers ?

  5. Comment tuer un processus avec une phrase en son nom ? ?

Comment tuer un processus sous Linux

Comment intégrer ONLYOFFICE 9.6 à WordPress

Comment vérifier l'utilisation de la mémoire du processus avec la commande Linux pmap

Comment sécuriser les serveurs Linux avec SE Linux

Comment travailler avec le processus de premier plan et d'arrière-plan sous Linux

Comment tuer un processus <defunct> avec le parent 1