Exécution de ce qui suit à partir d'un écran de ligne de commande:
bash -c "v=value; echo $v"
n'affiche rien. C'est bon? Comment puis-je affecter une valeur à une variable à l'intérieur de ce type d'exécution?
Exécution de ce qui suit à partir d'un écran de ligne de commande:
bash -c "v=value; echo $v"
n'affiche rien. C'est bon? Comment puis-je affecter une valeur à une variable à l'intérieur de ce type d'exécution?
Réponses:
Il y a deux obus impliqués ici:
Le shell appelant, le shell interactif à partir duquel vous exécutez ce
Le shell sans connexion, non interactif, généré par bash -c
Maintenant, le problème est que, entre guillemets, les variables sont développées à leurs valeurs respectives, cela est vrai pour n'importe quel shell.
Donc, comme vous avez utilisé des guillemets doubles, l'expansion variable, $v
se déroule en fait dans le shell appelant, pas dans le shell appelé. Mais la déclaration v=value
,, a lieu sur le shell non interactif appelé.
Donc, au total, vous avez la variable définie dans le shell appelé et développée (au préalable) dans le shell appelant. Comme la variable de valeur n'est pas définie dans le shell appelant, vous n'obtenez rien dans la sortie.
Maintenant, pour que la définition et l'expansion des variables aient lieu dans le shell généré, utilisez des guillemets simples ou échappez $
:
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo \$v"
value
Avec des guillemets doubles $v
est remplacé par le shell interactif. Utilisez des guillemets simples:
$ bash -c 'v=value;echo $v'
value