GNU/Linux >> Tutoriels Linux >  >> Linux

Cette syntaxe Shell/bash :Somevariable=somevalue Somecommand?

Cette question a déjà des réponses ici :Est-ce un shell portable pour exécuter une commande sur la même ligne après l'affectation de variables ?

(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.

En relation :Debian – Pourquoi le partage CIFS affiche-t-il les mêmes fichiers plusieurs fois ?

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
[]

Linux
  1. Personnalisation de Bash Shell :Gras/couleur La commande ?

  2. Tutoriel sur l'état de sortie de Bash Shell avec des exemples pratiques

  3. 15 commandes intégrées utiles de Bash Shell (avec exemples)

  4. Comprendre les variables dans Bash Shell sous Linux

  5. Quelle est la différence entre &> et >&en bash ?

Commande d'attente bash

Commande Bash printf

Comment utiliser la commande Declare dans Linux Bash Shell

Bash Beginner Series #2 :Comprendre les variables dans les scripts shell Bash

Utilisation de la fonctionnalité d'historique sur Bash Shell sur le serveur Ubuntu 16.04 LTS

Commande Bash fc :utilisez facilement le shell Bash comme un pro