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 gccBeenden LANGwieder auf den vorherigen Wert (oder nicht festgelegt).
Außerdem ersetzt bei Verwendung A=10 echo $Adie Shell $ A, nicht Echo, und diese Ersetzung (als "Erweiterung" bezeichnet) erfolgt, bevor die Anweisung (einschließlich der Zuweisung) ausgewertet wird, damit der erwartete AWert bereits festgelegt werden kann in der aktuellen Umgebung vor dieser Aussage.
Das ist der Grund, warum A=10 echo $Anicht wie erwartet funktioniert: A=10Wird für Echo festgelegt, aber Echo ignoriert intern den Wert der Umgebungsvariablen A. Und $Awird 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 commandintern verwendet VAR. Wenn nicht, können Sie immer noch valueein 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 testscriptund 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, readund testsind 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?