GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Diese Shell/Bash-Syntax:Somevariable=somevalue Somecommand?

Für diese Frage gibt es hier bereits Antworten :Ist es Shell portabel, einen Befehl in derselben Zeile nach der Variablenzuweisung auszuführen?

(4 Antworten)
Vor 2 Jahren geschlossen.

Einer meiner Kollegen hat mir eine Bash-Syntax zur Verfügung gestellt, mit der ich nicht vertraut bin. Mein Google foo hat mich beim Herausfinden dessen, was es tut und warum/wann ich es verwenden sollte, im Stich gelassen.

Der Befehl, den er mir schickte, hatte folgende Form:

someVariable=something 
command

Anfangs dachte ich, dass dies äquivalent zu Folgendem wäre:

someVariable=something ; command

Oder

someVariable=something 
command

Dies scheint jedoch nicht der Fall zu sein. Beispiele:

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

Was macht diese Syntax? Was passiert mit der gesetzten Variable? Warum funktioniert das?

Akzeptierte Antwort:

Dies entspricht:

( export someVariable=something; command )

Dies macht someVariable eine Umgebungsvariable mit dem zugewiesenen Wert, aber nur für den ausgeführten Befehl.

Hier sind die relevanten Teile der bash Handbuch:

Einfache Befehle

Ein einfacher Befehl ist eine Folge von optionalen Variablenzuweisungen gefolgt von durch Leerzeichen getrennten Wörtern und Umleitungen und abgeschlossen durch einen Kontrolloperator. Das erste Wort gibt den auszuführenden Befehl an und wird als Argument Null übergeben. Die restlichen Wörter werden als Argumente an den aufgerufenen Befehl übergeben.

(…)

Einfache Befehlserweiterung

Wenn [aus der Befehlserweiterung] kein Befehlsname resultiert, wirken sich die Variablenzuweisungen auf die aktuelle Shell-Umgebung aus. Andernfalls werden die Variablen der Umgebung des ausgeführten Befehls hinzugefügt und wirken sich nicht auf die aktuelle Shell-Umgebung aus .

Hinweis:Denken Sie daran, dass dies nicht spezifisch für bash ist , aber spezifiziert durch POSIX.

Siehe auch:Debian – Warum zeigt die CIFS-Freigabe dieselben Dateien mehrmals an?

Bearbeiten – Zusammengefasste Diskussion aus Kommentaren in der Antwort

Der Grund BAZ=JAKE echo $BAZ , druckt JAKE nicht, weil die Variablenersetzung vor allem anderen erfolgt. Wenn Sie die Variablensubstitution umgehen, verhält sich dies wie erwartet:

$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]

Linux
  1. 6 Verkettungsoperatoren für Bash-Shell-Befehlszeilen unter Linux

  2. Bash-Skript:Verwendung eines Skriptbefehls aus einem Bash-Skript zum Protokollieren einer Sitzung

  3. Bash-Exportbefehl

  4. Was bedeutet die Syntax |&in der Shell-Sprache?

  5. Was bedeutet „! -d` in diesem Bash-Befehl?

Bash-Wartebefehl

Bash-printf-Befehl

So verwenden Sie den Declare-Befehl in der Linux Bash Shell

Bash Beginner Series #2:Variables in Bash Shell Scripting verstehen

Verwendung der Verlaufsfunktion in Bash Shell auf Ubuntu 16.04 LTS-Server

Bash fc-Befehl:Verwenden Sie die Bash-Shell ganz einfach wie ein Profi