46 votes

Que signifie Shell-FORMAT dans envsubst ?

Lorsque je suis tombée sur envsubst Je voulais l'utiliser pour remplacer uniquement des variables spécifiques et je soupçonnais que le paramètre Shell-FORMAT pourrait être ce que je voulais, mais je n'arrive pas à le faire fonctionner.

Malheureusement, la man y info Les pages ne donnent aucun exemple d'utilisation et se contentent de dire

Si un format Shell-FORMAT est donné, seules les variables d'environnement référencées dans le format Shell-FORMAT sont remplacées.

Ce qui ne m'indique pas comment les référencer.

40voto

Jon Colverson Points 984

Comme l'indique le texte, il suffit de référencer (par exemple par $VARNAME ou ${VARNAME} ) les variables comme dans une commande Shell habituelle. Cependant, vous devez vous assurer que la commande Shell ne les développe pas au préalable.

Voici quelques exemples pour illustrer cela (en supposant que export FOO=BAR ) :

$ echo '$FOO$FOO2' | envsubst
BAR

Comme vous pouvez le voir, $FOO2 a été remplacé par "" car il n'était pas défini. Nous pouvons maintenant limiter ce remplacement à $FOO par :

$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2

en utilisant "" au lieu de '' conduirait à une substitution avant qu'elle ne soit souhaitée :

echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2

(Cela équivaut à l'appel effectif envsubst "BAR" qui ne détecte aucune variable, de sorte qu'aucune n'est remplacée).

En tant que man -La page de garde indique que toutes les variables qui sont référencées dans la page de garde sont des variables qui ne sont pas référencées dans la page de garde. SHELL-FORMAT sont remplacés, ce qui nous permet de le faire :

echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2

Comme vous pouvez le constater, le SHELL-FORMAT est assez flexible.

Enfin, le paramètre --variables vous permet d'évaluer quelles variables sont sélectionnées pour la substitution par la fonction SHELL-FORMAT :

envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3

Dans l'exemple de la substitution prématurée ci-dessus, cela aurait montré l'erreur :

$ envsubst --variables "$FOO"
(empty string returned)

Comme indiqué dans le man -page, envsubst ne traite aucune entrée stdinput lorsque --variables est présent.

17voto

dedeibel Points 302

Voici quelques exemples qui m'ont aidé à comprendre comment l'utiliser correctement. J'ai été surpris par le fait que envsubst ne remplace que les variables mentionnées dans le paramètre.

export FOO_X="value_x"
export FOO_Y="value_y"
export FOO_Z="value_z"

$ echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst
x=value_x y=value_y z=value_z

$  echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst '$FOO_X'
x=value_x y=$FOO_Y z=${FOO_Z}

$ echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst '$FOO_X $FOO_Z'
x=value_x y=$FOO_Y z=value_z

$ echo 'x=${FOO_X} y=${FOO_Y} z=${FOO_Z}' | envsubst '$FOO_Z ${FOO_Y}'
x=${FOO_X} y=value_y z=value_z

$VAR y ${VAR} Les deux semblent fonctionner. L'ordre n'a pas d'importance.

Je n'ai pas non plus compris ce que signifiait Shell-FORMAT, et je ne sais toujours pas pourquoi il est nommé ainsi. Mais après les expériences ci-dessus, je pense savoir ce qu'il fait.

3voto

Ammo Goettsch Points 315

Le verbiage est un peu confus. Reformuler le texte d'aide plus méticuleusement :

SHELL-FORMAT est un argument de ligne de commande facultatif contenant des références à des variables d'environnement. Pour faire référence à une variable d'environnement dans le texte, préfixez le nom de la variable par un $ . Par exemple : Hello $FOO World $BAR renvoie à des variables d'environnement FOO y BAR . Le reste de la chaîne est ignoré. Si la chaîne de caractères SHELL-FORMAT est présent, la substitution de variables sur le texte reçu par stdin sera limitée aux variables référencées dans l'argument de ligne de commande SHELL-FORMAT argument de ligne de commande.

Pour répondre explicitement à votre question : Préfixer le nom de la variable par $ .

-1voto

user1220323 Points 1

Je l'ai trouvé particulièrement utile pour cela...

    cat myfile|envsubst '$(env|grep AJN)'

Ceci substitue toutes les variables qui sont actuellement définies dans mon environnement (env), et qui contiennent AJN (Mes initiales.), mais laisse toutes les autres variables tranquilles.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X