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
, LANG
al 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 A
il valore atteso deve essere già impostato nell'ambiente attuale prima di tale affermazione.
Ecco perché A=10 echo $A
non funziona come previsto: A=10
verrà impostato per l'eco, ma l'eco ignora internamente il valore della variabile d'ambiente A
. E $A
viene 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 command
internamente usa VAR. In caso contrario, puoi comunque passare value
come 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 testscript
e 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
, read
e test
sono 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
?