Wenn Sie , LANG=C gcc ...
was passiert , ist , dass die Schale LANG für setzt gcc
‚s Umwelt nur , und nicht für die aktuelle Umgebung selbst ( siehe Hinweis ). Ist also nach dem gcc
Beenden LANG
wieder auf den vorherigen Wert (oder nicht festgelegt).
Außerdem ersetzt bei Verwendung A=10 echo $A
die Shell $ A, nicht Echo, und diese Ersetzung (als "Erweiterung" bezeichnet) erfolgt, bevor die Anweisung (einschließlich der Zuweisung) ausgewertet wird, damit der erwartete A
Wert bereits festgelegt werden kann in der aktuellen Umgebung vor dieser Aussage.
Das ist der Grund, warum A=10 echo $A
nicht wie erwartet funktioniert: A=10
Wird für Echo festgelegt, aber Echo ignoriert intern den Wert der Umgebungsvariablen A
. Und $A
wird durch den in der aktuellen Shell festgelegten Wert ersetzt (bei dem es sich um keinen handelt) und dann als Argument an Echo übergeben.
So Ihre Annahme richtig ist: VAR=value command
tut Arbeit, aber dies ist nur relevant , wenn command
intern verwendet VAR. Wenn nicht, können Sie immer noch value
ein Argument an übergeben command
, aber die Argumente werden durch die aktuelle Shell ersetzt, sodass sie vor der Verwendung festgelegt werden müssen:VAR=value; command "$VAR"
Wenn Sie wissen, wie man ein ausführbares Skript erstellt, können Sie dies als Test versuchen:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Speichern Sie es als testscript
und versuchen Sie:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Last but not least, es lohnt sich, den Unterschied zwischen Wissen Shell und Umwelt Variablen und Programm Argumente .
Hier sind einige gute Referenzen:
.
(*) Hinweis: technisch die Schale nicht in der aktuellen Umgebung gesetzt auch, und hier ist der Grund: Einige Befehle, wie echo
, read
und test
sind Schale builtins , und als solche sie laichen kein Kind - Prozess. Sie laufen in der aktuellen Umgebung. Die Shell kümmert sich jedoch nur darum, dass die Zuweisung so lange dauert, bis der Befehl ausgeführt wird. In der Praxis ist der Effekt also derselbe: Die Zuweisung wird nur von diesem einzelnen Befehl gesehen.
A=10 (echo $A)
und bekommen10
?