(4 réponses)
Fermé il y a 2 ans.
Un de mes collègues m'a fourni une syntaxe Bash que je ne connais pas. Mon truc Google ne m'a pas permis de comprendre ce qu'il fait et pourquoi/quand je devrais l'utiliser.
La commande qu'il m'a envoyée était de cette forme :
someVariable=something
command
Au départ, je pensais que cela équivalait à ce qui suit :
someVariable=something ; command
Ou
someVariable=something
command
Mais cela ne semble pas être le cas. Exemples :
[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ
[Jan-03 11:27][~]$ # Try running a command of the same format
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:
[Jan-03 11:27][~]$ echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results:
[Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ
jake
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # And we can see that the variable is actually set:
[Jan-03 11:29][~]$ echo $BAZ
jake
[Jan-03 11:29][~]$
A quoi sert cette syntaxe ? Qu'advient-il de la variable qui a été définie ? Pourquoi ça marche ?
Réponse acceptée :
Cela équivaut à :
( export someVariable=something; command )
Cela rend someVariable
une variable d'environnement, avec la valeur assignée, mais uniquement pour la commande en cours d'exécution.
Voici les parties pertinentes du bash
manuel :
Commandes simples
Une commande simple est une séquence d'affectations de variables facultatives suivi de mots et de redirections séparés par des blancs, et terminé par un opérateur de contrôle. Le premier mot spécifie la commande à exécuter et est passé en argument zéro. Les mots restants sont passés en arguments à la commande invoquée.
(…)
Extension de commande simple
Si aucun nom de commande ne résulte [de l'expansion de la commande], les affectations de variables affectent l'environnement shell actuel. Sinon, les variables sont ajoutées à l'environnement de la commande exécutée et n'affectent pas l'environnement shell actuel .
Remarque :gardez à l'esprit que ce n'est pas spécifique à bash
, mais spécifié par POSIX.
Modifier – Discussion résumée à partir des commentaires dans la réponse
La raison BAZ=JAKE echo $BAZ
, n'imprime pas JAKE parce que la substitution de variable est effectuée avant toute autre chose. Si vous ignorez la substitution de variable, cela se comporte comme prévu :
$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]