Warum wird die Variablenzuweisung vor dem Befehl ignoriert?

Warum wird die Variablenzuweisung vor dem Befehl ignoriert?

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 echodies nicht tut. Aber Shell-Aufrufe wie diese bash -ctun 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:

  1. $xwird auf den Wert von ximaktuellHülse.
  2. Der Wert von xin der Umgebung des auszuführenden Befehls wird auf 123 gesetzt.
  3. Die erweiterte Befehlszeile wird nach einem Befehl durchsucht und echogefunden.
  4. echowird in einer Umgebung ausgeführt x, in der der Wert auf 123 eingestellt ist und $1auf den Wert eingestellt wird, der xin Schritt 1 festgelegt wurde.
  5. echogibt $1an die Standardausgabe aus, ignoriert aber ansonsten die anderen Werte in seiner Umgebung.

Beachten Sie, dass es $xsich hierbei um ein Argument handelt, xdas vom dem Befehl vorangestellt ist.

verwandte Informationen