Die Manpage zu Bash 4.1 besagt(Betonung hinzugefügt)...
Einfache Befehle
Ein einfacher Befehl isteine Folge optionaler Variablenzuweisungen, gefolgt von durch Leerzeichen getrennten Wörternund Umleitungen und von einem Kontrolloperator beendet. Die ersteWortgibt den auszuführenden Befehl an und wird als Argument Null übergeben. Die restlichen Wörter werden als Argumente an den aufgerufenen Befehl übergeben.
Überprüfen der Version auf meinem System(NICHT für Shellshock gepatcht)...
# bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...
Allerdings sollen vorangehende Variablenzuweisungen ohne Semikolon eine Möglichkeit sein, Umgebungsvariablenwerte nur für die Dauer dieses einen Befehlsaufrufs zu lokalisieren, aber das scheint nicht der Fall zu sein ...
# x=123 echo $x; unset x; echo $x
bash: x: unbound variable
# x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
# x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
# x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
# x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
# x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
Lösung
Prodiese Antwort auf eine andere Fragees scheint, dass der Befehl absichtlich die Umgebungsvariablen seines übergeordneten Befehls verwenden muss und echo
dies nicht tut. Aber Shell-Aufrufe wie diese bash -c
tun dies ...
x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable
Ressourcen
Antwort1
Diese Linie
x=123 echo $x
wird in der folgenden Reihenfolge ausgewertet:
$x
wird auf den Wert vonx
imaktuellHülse.- Der Wert von
x
in der Umgebung des auszuführenden Befehls wird auf 123 gesetzt. - Die erweiterte Befehlszeile wird nach einem Befehl durchsucht und
echo
gefunden. echo
wird in einer Umgebung ausgeführtx
, in der der Wert auf 123 eingestellt ist und$1
auf den Wert eingestellt wird, derx
in Schritt 1 festgelegt wurde.echo
gibt$1
an die Standardausgabe aus, ignoriert aber ansonsten die anderen Werte in seiner Umgebung.
Beachten Sie, dass es $x
sich hierbei um ein Argument handelt, x
das vom dem Befehl vorangestellt ist.