2017-08-22 3 views
1

Je sais que je peux utiliser la fonction de substitution de processus de bash pour spécifier un paramètre de fichier via la substitution de processus, puis utiliser un document ici pour préciser les données, comme ceci:Utiliser la substitution de processus avec HereDocument qui est stocké dans une variable

foo --config <(cat <<EOF 
# contents of config file 
... 
EOF 
) 

Lorsque j'ai besoin du même document ici à deux endroits différents dans le même script, il serait plus utile de stocker le document ici dans une variable.

Comment puis-je faire quelque chose comme ceci:

read -r -d '' MY_CONFIG <<EOF 
# contents of config file 
... 
EOF 

Alors, comment puis-je appeler foo pour passer le contenu de $MY_CONFIG au paramètre --config?

Répondre

1

La solution est survenue lors de l'écriture de cette question. Plutôt que d'utiliser <(cat ...), nous pouvons utiliser <(echo ...) pour écrire quelque chose à partir de la substitution de processus. Ainsi, nous pouvons simplement utiliser:

foo --config <(echo "$MY_CONFIG") 

Un exemple simple pour tester ce serait ceci:

MY_CONFIG="hello world" 
less -f <(echo "$MY_CONFIG") 

Cela devrait ouvrir moins et montrer hello world dans le tampon.

+0

'less' peut donner un faux positif:' moins -f <<< "MY_CONFIG $" 'produit le même résultat que votre exemple , mais le fait en utilisant stdin pas un fichier. Pour mieux approcher l'usage que vous souhaitez, considérez 'md5sum <(echo" $ MY_CONFIG ")' vs 'md5sum <<<" $ MY_CONFIG "'. – bishop

1

Je considère que la solution que vous avez trouvée vous-même est plus simple, mais pour être complet, voici comment vous pourriez le faire avec les docs.

Pour stocker un ici-doc dans une variable, vous pouvez utiliser (> est la chaîne rapide secondaire):

$ var=$(cat <<EOF 
> line1 
> line2 
> EOF 
>) 
$ declare -p var 
declare -- var="line1 
line2" 

Ensuite, utiliser un ici-doc avec le contenu de cette variable:

$ cat <<EOF 
> $var 
> EOF 
line1 
line2 

Ie, pour votre cas, quelque chose comme ceci:

$ foo --config <(cat <<EOF 
> $var 
> EOF 
>) 

comme je l'ai dit, il est cl au début plus simple d'utiliser simplement <(echo "$var") ou <(printf '%s\n' "$var") à la place.

2

De plus, vous pouvez utiliser un herestring intérieur de la substitution de processus:

MY_CONFIG="hello world" 
md5sum <(<<< "$MY_CONFIG")