3 votes

Les assignations de variables de la ligne de commande dans Cygwin Bash ne fonctionnent pas ?

Selon la section 3.7.1 du manuel Bash, les assignations de variables au début d'une ligne de commande doivent être visibles par le programme invoqué.

par exemple

DIR=/tmp ls $DIR

doit se comporter comme si j'avais tapé "ls /tmp" - et la variable DIR ne doit pas persister après l'exécution de la commande.

Cygwin Bash (GNU bash, version 3.2.51(24)-release (i686-pc-cygwin)) semble ne pas faire cela - la commande ci-dessus se comporte comme si $DIR n'était pas défini. Ceci est confirmé par d'autres tests tels que "DIR=/tmp echo $DIR", "DIR=/tmp set" etc.

Notez que l'ajout d'un point-virgule fonctionne ("DIR=/tmp ; ls $DIR"), mais laisse la variable définie après la commande.

Pourquoi cela ne fonctionne-t-il pas comme prévu ?

3voto

Jonathan Leffler Points 299946

Cela fonctionne, mais pas dans le contexte où vous essayez de le faire fonctionner.

DIR=/tmp ls $DIR

La variable d'environnement DIR est définie pour ls - mais n'est pas défini lorsque l'interpréteur de commandes développe le $DIR de la commande. C'est ainsi que se comportait l'interpréteur de commandes Bourne ; c'est ainsi que se comportent ses successeurs tels que l'interpréteur de commandes Korn et Bash.

Vous pouvez voir que DIR est activé en changeant la valeur de ls $DIR a env qui montrerait l'environnement d'une commande externe (non intégrée).

Dans cet exemple, réfléchissez un instant : ce que vous avez tapé représente 9 caractères supplémentaires par rapport à :

ls /tmp

Si vous devez le mettre en place et le retirer, il fait l'affaire :

(DIR=/tmp; ls $DIR)

La variable est définie avant que le shell n'évalue ls $DIR mais la commande entière est exécutée dans un sous-shell et n'a donc pas d'impact sur le shell qui l'invoque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X