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 gcc
zakończeniu LANG
powraca do poprzedniej wartości (lub jest wyłączony).
Dodatkowo, gdy A=10 echo $A
go 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 $A
nie działa zgodnie z oczekiwaniami: A=10
zostanie ustawiony na echo, ale echo wewnętrznie ignoruje wartość zmiennej środowiskowej A
. I $A
jest 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, command
wewnętrznie używa var. Jeśli nie, to nadal można przekazać value
jako 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 testscript
i 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
, read
i test
są 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
?