Respuestas:
Para los shells compatibles con POSIX (incluido Bash), el estándar dice:
2.5.3 Variables de Shell Las
variables se inicializarán desde el entorno [...] Si una variable se inicializa desde el entorno, se marcará para exportación inmediatamente; ver el especial de exportación incorporado. Se pueden definir e inicializar nuevas variables con asignaciones de variables, [etc.]
Y sobre export
:
export name[=word]...
El shell dará el atributo de exportación a las variables correspondientes a los nombres especificados, lo que hará que estén en el entorno de los comandos ejecutados posteriormente.
Entonces, desde el punto de vista del shell, solo hay variables. Algunos de ellos pueden haber venido del entorno cuando se inició el shell, y algunos de ellos pueden exportarse al entorno de los procesos que inicia el shell.
(El "entorno" es realmente solo un montón de cadenas pasadas al proceso cuando comienza. Cuando el proceso se está ejecutando, puede hacer lo que quiera con eso, usarlo, ignorarlo, sobrescribirlo. Y qué proceso pasa cuando iniciar otros procesos puede ser otra cosa, aunque, por supuesto, es habitual pasar todas las variables de entorno nuevamente).
Si estaba utilizando un shell que no es POSIX, por ejemplo csh
, las cosas podrían ser diferentes:
$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
Estas son la misma variable. En el shell, a diferencia de la mayoría de los otros lenguajes de programación, las variables de entorno y las variables de shell comparten el mismo espacio de nombre. En el shell, una variable de entorno es una variable de shell que se ha exportado con export
.
Vea, por ejemplo, mi respuesta a su pregunta anterior " ¿Cuál es la diferencia en el uso entre las variables de shell y las variables de entorno? "
La variable de shell solo se puede usar para el shell actual, no se puede usar en todo el sistema. En el otro extremo, se puede usar Variable ambiental en todo el sistema. Por convención, las variables de shell se escriben en minúsculas, mientras que las variables de entorno se escriben en mayúsculas. Puede hacer que una variable de shell funcione como una variable de entorno, solo necesita exportarla.