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