Remplacement de variables spécifiques uniquement par envsubst

54

J'essaie de remplacer les variables d'environnement par le biais envsubst, mais je veux seulement remplacer des variables spécifiques.

D'après la documentation, je devrais pouvoir dire envsubstde ne remplacer que certaines variables, mais je ne parviens pas à le faire.

Par exemple, si j'ai un fichier contenant:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

comment dois-je exécuter envsubstpour qu'il ne remplace que la référence à ${VAR_1}?

João Angelo
la source

Réponses:

131

Par la page de manuel:

envsubst [OPTION] [SHELL-FORMAT]

Si un SHELL-FORMAT est donné, seules les variables d'environnement référencées dans SHELL-FORMAT sont remplacées; sinon, toutes les références aux variables d'environnement apparaissant dans l'entrée standard sont substituées.

Où les chaînes SHELL-FORMAT sont des "chaînes avec des références à des variables de shell sous la forme $variableou ${variable}[...] ignoré. " .
Donc, il faut passer les noms des variables respectives envsubstdans une chaîne de formatage (évidemment, ils doivent être échappés / cités pour pouvoir être passés littéralement à envsubst). Exemple:

fichier d'entrée par exemple infile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

et des valeurs comme

export  VAR1="one" VAR2="two" VAR3="three"

puis courir

envsubst '${VAR1} ${VAR3}' <infile

ou

envsubst '${VAR1},${VAR3}' <infile

ou

envsubst '${VAR1}
${VAR3}' <infile

les sorties

VAR1=one
VAR2=${VAR2}
VAR3=three

Ou, si vous préférez une barre oblique inverse:

envsubst \$VAR1,\$VAR2 <infile

produit

VAR1=one
VAR2=two
VAR3=${VAR3}
don_crissti
la source
14
pourquoi n'est-ce pas la réponse acceptée?
Qsiris
3
Oui c'est la bonne réponse!
Thomas Decaux
3
Si vous connaissez un préfixe de variable à utiliser pour limiter les variables pouvant être substituées:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott le
Ou si vous en avez une liste à ce moment- SUBST_VARSlà:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott