J'essaie d'appeler une commande Shell avec un environnement modifié via la commande env
.
Selon le manuel
env HELLO='Hello World' echo $HELLO
devrait echo Hello World
, mais ça ne le fait pas . Si je le fais
HELLO='Hello World' bash -c 'echo $HELLO'
il imprime Hello World
comme prévu (grâce à cette réponse pour cette information).
Qu'est-ce que j'oublie ici?
Salutations, Niklas
C'est parce que dans votre premier cas, votre Shell actuel développe la variable $ HELLO avant d'exécuter les commandes. Et il n'y a pas de variable HELLO définie dans votre Shell actuel.
env HELLO='Hello World' echo $HELLO
fera ceci:
Comme vous le voyez, le shell actuel a développé la variable $ HELLO, qui n'est pas définie.
HELLO='Hello World' bash -c 'echo $HELLO'
fera ceci:
HELLO='Hello World
pour la commande suivanteecho $HELLO
Si vous avez essayé de le faire, par exemple ce:
env HELLO='Hello World' echo '$HELLO'
Dans ce cas, aucun Shell ne développera le $ HELLO, donc echo reçoit la chaîne $HELLO
et l'imprime. L'expansion variable est faite par les coquilles seulement.
Je pense que ce qui se passe est similaire à cette situation dans laquelle j'étais aussi perplexe.
En un mot, le développement de la variable dans le premier cas est effectué par le Shell actuel qui n'a pas $HELLO
dans son environnement. Dans le second cas, toutefois, les guillemets simples empêchent le Shell actuel de procéder à l'expansion des variables, de sorte que tout fonctionne comme prévu.
Notez que la modification de guillemets simples en guillemets doubles empêche cette commande de fonctionner comme vous le souhaitez:
HELLO='Hello World' bash -c "echo $HELLO"
Maintenant, cela échouera pour la même raison que la première commande de votre question.
Cela fonctionne et est bon pour moi
$ MY_VAR='Hello' ANOTHER_VAR='World!!!' && echo "$MY_VAR $ANOTHER_VAR"
Hello World!!!
Voici un moyen plus simple de confirmer que Shell fonctionne comme prévu.
env A=42 env
env
La première commande exécute A
sur 42 et env
. La deuxième commande exécute également env
. Comparez la sortie des deux.