Qu'est-ce que SHELL-FORMAT dans envsubst?

19

Lorsque je suis tombé sur, envsubstje voulais l'utiliser pour remplacer uniquement des variables spécifiques et je soupçonnais que le paramètre SHELL-FORMAT pourrait être ce que l'on voulait mais je ne peux pas le faire fonctionner.

Malheureusement, les pages manet infone donnent aucun exemple d'utilisation et indiquent seulement

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

Ce qui ne me dit pas comment les référencer.

Personne
la source

Réponses:

20

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

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

$ echo '$FOO$FOO2' | envsubst
BAR

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

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

utiliser à la ""place de ''entraînerait une substitution avant qu'elle ne soit voulue:

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

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

Comme le mandit la page, toutes les variables référencées SHELL-FORMATsont remplacées, nous pouvons donc même le faire:

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

Comme vous pouvez le voir, le SHELL-FORMATest assez flexible.

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

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

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

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

Comme indiqué dans la page man, envsubstne traite aucun stdinput lorsqu'il --variablesest présent.

Personne
la source
8

Voici quelques exemples qui m'ont aidé à comprendre comment l'utiliser correctement. Il était surprenant pour moi que envsubstonly remplace les variables mentionnées dans le paramètre.

$ export FOOX="foox"
$ export FOOY="fooy"
$ export FOOZ="fooz"

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst            
x foox y fooy z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX'
x foox y $FOOY z $FOOZ

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX $FOOZ'
x foox y $FOOY z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOZ $FOOY'
x $FOOX y fooy z fooz

Je ne comprenais pas non plus ce que SHELL-FORMAT voulait dire, je ne sais toujours pas pourquoi il est nommé ainsi. Mais après les expériences ci-dessus, je pense que je sais ce que ça fait.

dedeibel
la source
Cela m'aide beaucoup après avoir lu ces exemples, à partir de l'aide et des informations de l'homme, sachez que le format SHELL existe, mais ne savez pas comment le déclarer!
zw963
0

Le verbiage est un peu confus. Pour reformuler le texte d'aide de manière plus méticuleuse:

SHELL-FORMATest un argument de ligne de commande de texte facultatif contenant des références aux variables d'environnement. Pour référencer une variable d'environnement dans le texte, préfixez le nom de la variable avec a $. Par exemple: fait Hello $FOO World $BARréférence aux variables d'environnement FOOet BAR. Le reste de la chaîne est ignoré. Si l' SHELL-FORMATargument de ligne de commande est présent, alors lorsque la substitution de variable se produit sur le texte reçu via stdin, il sera limité aux variables référencées dans l' SHELL-FORMATargument de ligne de commande.

Donc, pour répondre explicitement à votre question: préfixez le nom de la variable avec $.

wizulus
la source