Cuando se utiliza LANG=C gcc ...
lo que sucede es que la cáscara establece LANG para el gcc
medio ambiente 's solamente , y no para el actual entorno de sí mismo ( ver nota ). Entonces, después de que gcc
finaliza, LANG
vuelve a su valor anterior (o no establecido).
Además, cuando lo usa A=10 echo $A
es 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 A
el valor esperado ya debe estar establecido en el entorno actual anterior a esa declaración.
Es por eso A=10 echo $A
que no funciona como se esperaba: A=10
se establecerá para echo, pero echo ignora internamente el valor de la variable de entorno A
. Y $A
se 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 command
internamente utiliza VAR. De lo contrario, puede pasar value
como 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 testscript
y 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
, read
y test
está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
?