Cela revient à une question sur le fonctionnement de l'évaluation. Les deux exemples fonctionnent de la même manière, le problème se produit en raison de la façon dont le shell (bash, ici) développe les variables.
Lorsque vous écrivez cette commande:
HOME="foo" echo $HOME
Le $HOME
est dilatée avant la commande est exécutée . Par conséquent, il est étendu à la valeur d'origine et non à la nouvelle valeur que vous avez définie pour la commande. La HOME
variable a en effet été modifiée dans l'environnement dans lequel la echo
commande s'exécute, cependant, vous imprimez le $HOME
depuis le parent.
Pour illustrer, considérez ceci:
$ HOME="foo" bash -c 'echo $HOME'
foo
$ echo $HOME
/home/terdon
Comme vous pouvez le voir ci-dessus, la première commande imprime la valeur temporairement modifiée de HOME
et la seconde imprime l'original, démontrant que la variable n'a été modifiée que temporairement. Étant donné que la bash -c ...
commande est placée entre guillemets simples ( ' '
) au lieu de doubles ( " "
), la variable n'est pas développée et est transmise telle quelle au nouveau processus bash. Ce nouveau processus le développe ensuite et imprime la nouvelle valeur à laquelle il a été défini. Vous pouvez voir cela se produire si vous utilisez set -x
:
$ set -x
$ HOME="hello" echo "$HOME"
+ HOME=hello
+ echo hello
hello
Comme vous pouvez le voir ci-dessus, la variable $HOME
n'est jamais passée à echo
. Il ne voit que sa valeur étendue. Comparer avec:
$ HOME="hello" bash -c 'echo $HOME'
+ HOME=hello
+ bash -c 'echo $HOME'
hello
Ici, en raison des guillemets simples, la variable et non sa valeur sont transmises au nouveau processus.
local
.eval
éviter la solution?Il existe deux étendues: les variables d'environnement et les variables locales. Les variables d'environnement sont valides pour chaque processus (voir
setenv
,getenv
), tandis que les variables locales ne sont actives que dans cette session shell. (Ce n'est pas une distinction évidente ...)Impliqué
env
(comme dans votre exemple) modifie l'environnement, tout enecho ...
utilisant les locaux -env
n'a donc aucun effet.Pour modifier les variables locales, utilisez, par exemple,
Ici, les parenthèses définissent la portée de cette affectation.
la source