web-dev-qa-db-fra.com

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

Lorsque j’ai trébuché sur envsubst, je voulais l’utiliser pour remplacer uniquement des variables spécifiques et je soupçonnais que le paramètre Shell-FORMAT était peut-être celui qui était recherché, mais je ne parviens pas à le faire fonctionner.

Malheureusement, les pages man et info ne 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.

19
Nobody

Comme indiqué dans le texte, il vous 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 le shell ne les développe pas auparavant.

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

$ echo '$FOO$FOO2' | envsubst
BAR

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

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

utiliser "" au lieu de '' entraînerait une substitution avant que cela ne soit voulu:

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

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

Comme le dit la page man-, toutes les variables référencées dans Shell-FORMAT sont remplacées. Nous pouvons même 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 permet d’évaluer les variables sélectionnées pour la substitution par le 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-, envsubst ne traite aucun stdinput lorsque --variables est présent.

18
Nobody

Voici quelques exemples qui m'ont aidé à comprendre comment l'utiliser correctement. Il était surprenant pour moi de remplacer de manière étonnante 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 ce que Shell-FORMAT voulait dire non plus, je ne sais toujours pas pourquoi il porte ce nom. Mais après les expériences ci-dessus, je pense savoir ce que ça fait.

4
dedeibel

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

Shell-FORMAT est un argument de ligne de commande texte facultatif contenant des références à des variables d'environnement. Pour référencer une variable d'environnement dans le texte, préfixez le nom de la variable avec un $. Par exemple, Hello $FOO World $BAR fait référence aux variables d'environnement FOO et BAR. Le reste de la chaîne est ignoré. Si l'argument de ligne de commande Shell-FORMAT est présent, la substitution de variable sur du texte reçu via stdin sera limitée aux variables référencées dans l'argument de ligne de commande Shell-FORMAT.

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

0
wizulus