Quando si utilizza LANG=C gcc ... quello che succede è che la shell imposta LANG per gcc's ambiente solo , e non per l' attuale ambiente stesso ( vedi nota ). Quindi gcc, LANGal termine, torna al valore precedente (o non impostato).
Inoltre, quando lo usi A=10 echo $Aè la shell che sostituisce $ A, non l'eco, e questa sostituzione (chiamata "espansione") avviene prima della valutazione dell'istruzione (incluso l'assegnazione), quindi per funzionare come Ail valore atteso deve essere già impostato nell'ambiente attuale prima di tale affermazione.
Ecco perché A=10 echo $Anon funziona come previsto: A=10verrà impostato per l'eco, ma l'eco ignora internamente il valore della variabile d'ambiente A. E $Aviene sostituito con il valore impostato nella shell corrente (che è nessuno), e quindi passato come argomento di eco.
Quindi la tua ipotesi è corretta: VAR=value command fa il lavoro, ma questo è rilevante solo se commandinternamente usa VAR. In caso contrario, puoi comunque passare valuecome argomento a command, ma gli argomenti vengono sostituiti dalla shell corrente , quindi devono essere impostati prima dell'uso:VAR=value; command "$VAR"
Se sai come creare uno script eseguibile, puoi provare questo come test:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Salvalo come testscripte prova:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Ultimo ma non meno importante, vale la pena conoscere la differenza tra variabili shell e ambiente e argomenti del programma .
Ecco alcuni buoni riferimenti:
.
(*) Nota: tecnicamente la shell si trova anche nell'ambiente attuale, ed ecco perché: alcuni comandi, come echo, reade testsono built-in della shell , e come tali non generano un processo figlio. Funzionano nell'ambiente attuale. Ma la shell si occupa dell'assegnazione dura solo fino a quando il comando non è in esecuzione, quindi a tutti gli effetti pratici l'effetto è lo stesso: l'assegnazione è vista solo da quel singolo comando.
A=10 (echo $A)e ottenere10?