Comment définir une variable d'environnement sur la command line et l'afficher dans les commands?

Si je cours

export TEST=foo echo $TEST 

Il sort foo.

Si je cours

 TEST=foo echo $TEST 

Ce ne est pas. Comment puis-je get cette fonctionnalité sans utiliser l'export ou un script?

Cela est dû au fait que l'interpréteur de commands étend la variable dans la command line avant d' exécuter la command et qu'à ce moment la variable n'existe pas. Si tu utilises

 TEST=foo; echo $TEST 

ça va marcher.

export fera apparaître la variable dans l'environnement des commands exécutées ultérieurement (pour voir comment cela fonctionne dans bash voir l' help export ). Si vous avez seulement besoin que la variable apparaisse dans l'environnement d'une command, utilisez ce que vous avez essayé, par exemple:

 TEST=foo your-application 

Je soupçonne que vous voulez avoir des variables shell ayant une scope limitée, plutôt que des variables d'environnement. Les variables d'environnement sont une list de strings transmises aux commands lorsqu'elles sont exécutées .

Dans

 var=value echo whatever 

Vous transmettez la string var=value à l'environnement que l'écho reçoit. Cependant, echo ne fait rien avec sa list d'environnement et de toute façon dans la plupart des shells, l' echo est embedded et donc pas exécuté .

Si vous aviez écrit

 var=value sh -c 'echo "$var"' 

Cela aurait été une autre affaire. Ici, nous passons var=value à la command sh , et sh arrive à utiliser son environnement. Les shells convertissent chacune des variables qu'ils reçoivent de leur environnement en une variable shell, de sorte que la variable d'environnement var sh reçoit sera convertie en une variable $var , et lorsqu'elle sera développée dans cette command line echo , elle deviendra la echo value . Parce que l'environnement est hérité par défaut, echo recevra également var=value dans son environnement (ou le ferait s'il était exécuté), mais encore une fois, echo ne se soucie pas de l'environnement.

Maintenant, si je soupçonne, ce que vous voulez est de limiter la scope des variables shell, il existe plusieurs approches possibles.

Portablement (Bourne et POSIX):

 (var=value; echo "1: $var"); echo "2: $var" 

Le (…) ci-dessus lance un sous-shell (un nouveau shell dans la plupart des shells), donc toute variable déclarée n'affectera que ce sous-shell, donc je m'attendrais à ce que le code ci-dessus produise "1: value" et "2:" ou "2: quel que soit-var-was-set-to-before".

Avec la plupart des coquilles Bourne, vous pouvez utiliser les fonctions et le "local" embedded:

 f() { local var var=value echo "1: $var" } f echo "2: $var" 

Avec zsh, vous pouvez utiliser les fonctions inline:

 (){ local var=value; echo "1: $var"; }; echo "2: $var" 

ou:

 function { local var=value; echo "1: $var"; }; echo "2: $var" 

Avec bash et zsh (mais pas ash, pdksh ou AT & T ksh), cette astuce fonctionne aussi:

 var=value eval 'echo "1: $var"'; echo "2: $var" 

Une variante qui fonctionne dans quelques autres shells ( dash , mksh , yash ) mais pas zsh (sauf en sh / ksh ):

 var=value command eval 'echo "1: $var"'; echo "2: $var" 

(en utilisant la command devant un specin builtin (ici eval ) dans POSIX shells supprime leur particularité (ici les affectations de variables d'entre elles restnt effectives après leur return))

Vous pouvez get ce travail en utilisant:

 TEST=foo && echo $TEST