Podczas korzystania z LANG=C gcc ... tego, co się dzieje, jest to, że powłoka ustawia LANG dla gcc„s środowiska tylko , a nie dla aktualnej samego środowiska ( patrz uwaga ). Więc po gcczakończeniu LANGpowraca do poprzedniej wartości (lub jest wyłączony).
Dodatkowo, gdy A=10 echo $Ago używasz , to powłoka zastępuje $ A, a nie echo, a to podstawienie (zwane „rozszerzeniem”) następuje przed oceną instrukcji (w tym przypisaniem), więc aby działać zgodnie z oczekiwaniami A, wartość musi być już ustawiona w obecnym środowisku przed tym stwierdzeniem.
Dlatego A=10 echo $Anie działa zgodnie z oczekiwaniami: A=10zostanie ustawiony na echo, ale echo wewnętrznie ignoruje wartość zmiennej środowiskowej A. I $Ajest zastępowany wartością ustawioną w bieżącej powłoce (która nie jest żadna), a następnie przekazywany jako argument do echa.
Więc założenie jest poprawne: VAR=value command ma pracy, ale jest to tylko w przypadku, commandwewnętrznie używa var. Jeśli nie, to nadal można przekazać valuejako argumentu do command, ale argumenty są zastępowane przez obecnego powłoki, więc muszą być ustawione przed użytkowania:VAR=value; command "$VAR"
Jeśli wiesz, jak utworzyć skrypt wykonywalny, możesz wypróbować to jako test:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Zapisz jako testscripti spróbuj:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Na koniec warto poznać różnicę między zmiennymi powłoki a zmiennymi środowiskowymi i argumentami programu .
Oto kilka dobrych referencji:
.
(*) Uwaga: technicznie powłoka ma ustawiony w obecnym środowisku też, a oto dlaczego: Niektóre polecenia, jak echo, readi testsą powłoki builtins , i jako takie nie tarło proces potomny. Działają w obecnym środowisku. Ale powłoka dba o to, aby przypisanie trwało tylko do momentu uruchomienia polecenia, więc dla wszystkich praktycznych celów efekt jest taki sam: przypisanie jest widoczne tylko dla tego pojedynczego polecenia.
A=10 (echo $A)i dostać10?