Variable de shell frente a variable de entorno, ¿cuál se prefiere si ambos tienen el mismo nombre?

10

Escribiendo lo siguiente en Bash:

env | grep USER

y

set | grep USER

da ambas veces el mismo nombre de usuario.

¿Cómo sé, por ejemplo, al escribir echo $USERsi se ha mostrado el shell o la variable de entorno?

Sharkant
fuente

Respuestas:

14

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
ilkkachu
fuente
1
Tenga en cuenta que el shell Bourne, como csh, inicializa las variables de shell de las variables de entorno. Pero modificar las variables de shell no afecta la variable de entorno correspondiente a menos que las exporte. Eso es algo que fue roto por el shell Korn (y especificado por POSIX). Es por eso que debe tener cuidado con el nombre de las variables de shell que usa ahora para asegurarse de que no está modificando los entornos que podrían afectar los comandos que ejecuta en su secuencia de comandos.
Stéphane Chazelas
4

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? "

Kusalananda
fuente
Volveré a leer su explicación, solo necesito aprender algunas cosas primero, antes de poder entender su respuesta.
Sharkant
@sharkant No te preocupes en absoluto. Si estoy confundiendo cosas, solo dímelo y trataré de aclararlo. La respuesta de ilkkachu también es buena.
Kusalananda
no, no lo creo, tienes un buen estilo de explicación, es solo mi falta de conocimiento lo que aún no puedo apreciar.
Sharkant
2

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.

Nazmul Ahmed Noyon
fuente