Cuando se utiliza LANG=C gcc ... lo que sucede es que la cáscara establece LANG para el gccmedio ambiente 's solamente , y no para el actual entorno de sí mismo ( ver nota ). Entonces, después de que gccfinaliza, LANGvuelve a su valor anterior (o no establecido).
Además, cuando lo usa A=10 echo $Aes el shell que reemplaza $ A, no echo, y esta sustitución (llamada "expansión") ocurre antes de que se evalúe la instrucción (incluida la asignación), por lo que para que funcione como Ael valor esperado ya debe estar establecido en el entorno actual anterior a esa declaración.
Es por eso A=10 echo $Aque no funciona como se esperaba: A=10se establecerá para echo, pero echo ignora internamente el valor de la variable de entorno A. Y $Ase reemplaza con el valor establecido en el shell actual (que no es ninguno), y luego se pasa como un argumento para hacer eco.
Por lo que su suposición es correcta: VAR=value command hace el trabajo, pero esto sólo es relevante si commandinternamente utiliza VAR. De lo contrario, puede pasar valuecomo argumento a command, pero los argumentos se reemplazan por el shell actual , por lo que deben establecerse antes del uso:VAR=value; command "$VAR"
Si sabe cómo crear un script ejecutable, puede intentarlo como prueba:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Guárdalo como testscripty prueba:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Por último, pero no menos importante, vale la pena conocer la diferencia entre las variables de entorno y shell y los argumentos del programa .
Aquí hay algunas buenas referencias:
.
(*) Nota: técnicamente, el shell también se establece en el entorno actual, y aquí está el por qué: algunos comandos, como echo, ready testestán integrados en el shell , y como tales no generan un proceso hijo. Se ejecutan en el entorno actual. Pero el shell se encarga de que la asignación solo dure hasta que se ejecute el comando, por lo que, a todos los efectos prácticos, el efecto es el mismo: la asignación solo es vista por ese comando único.
A=10 (echo $A)y obtener10?