Dies hängt von der Frage ab, wie die Bewertung funktioniert. Beide Beispiele funktionieren auf die gleiche Weise. Das Problem tritt auf, weil die Shell (hier bash) Variablen erweitert.
Wenn Sie diesen Befehl schreiben:
HOME="foo" echo $HOME
Das $HOME
wird erweitert, bevor der Befehl ausgeführt wird . Daher wird es auf den ursprünglichen Wert erweitert und nicht auf den neuen, den Sie für den Befehl festgelegt haben. Die HOME
Variable wurde in der Umgebung, in der der echo
Befehl ausgeführt wird, tatsächlich geändert. Sie drucken sie jedoch $HOME
vom übergeordneten Element aus.
Betrachten Sie zur Veranschaulichung Folgendes:
$ HOME="foo" bash -c 'echo $HOME'
foo
$ echo $HOME
/home/terdon
Wie Sie oben sehen können, gibt der erste Befehl den vorübergehend geänderten Wert von HOME
und der zweite das Original aus. Dies zeigt, dass die Variable nur vorübergehend geändert wurde. Da der bash -c ...
Befehl in einfache Anführungszeichen ( ' '
) anstatt in doppelte Anführungszeichen ( ) eingeschlossen ist " "
, wird die Variable nicht erweitert und unverändert an den neuen Bash-Prozess übergeben. Dieser neue Prozess erweitert es dann und druckt den neuen Wert, auf den er eingestellt wurde. Sie können dies sehen, wenn Sie Folgendes verwenden set -x
:
$ set -x
$ HOME="hello" echo "$HOME"
+ HOME=hello
+ echo hello
hello
Wie Sie oben sehen können, wird die Variable $HOME
niemals an übergeben echo
. Es sieht nur seinen erweiterten Wert. Vergleichen mit:
$ HOME="hello" bash -c 'echo $HOME'
+ HOME=hello
+ bash -c 'echo $HOME'
hello
Hier werden aufgrund der einfachen Anführungszeichen die Variable und nicht ihr Wert an den neuen Prozess übergeben.
local
.eval
Lösung vermieden werden?Es gibt zwei Bereiche: Umgebungsvariablen und lokale Variablen. Umgebungsvariablen sind für jeden Prozess gültig (siehe
setenv
,getenv
), während die lokalen Variablen nur innerhalb dieser Shell-Sitzung aktiv sind. (Es ist kein offensichtlicher Unterschied ...)Impliziert
env
(wie in Ihrem Beispiel) ändert die Umgebung, währendecho ...
die lokalen verwendet werden -env
hat also keine Auswirkung.Verwenden Sie zum Ändern der lokalen Variablen beispielsweise
Hier definieren die Klammern den Umfang dieser Zuordnung.
quelle