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