Variable de entorno vs variable de Shell, ¿cuál es la diferencia?

56

Alguien me dijo eso:

BASH no es una variable de entorno, es una variable de shell

¿Cual es la diferencia?

Tom Brito
fuente
¿Parece que lo mismo tiene un alcance diferente?
Alexander Mills

Respuestas:

35

$BASHes una variable local que es válida solo en el shell actual (bash).

Variables de entorno como $SHELLson válidas en todo el sistema. En un shell Bash actual, $BASHapunta a la ruta de ejecución de bash , mientras que $SHELLapunta al shell definido como predeterminado (que puede ser del mismo valor).

Para obtener una explicación de las variables de entorno, consulte Variables de entorno en la Ayuda de Ubuntu.

Takkat
fuente
1
Un gran enlace (+1) :)
Peter.O
12
Esta respuesta es incorrecta / inexacta. Las variables de entorno NO son globales / de todo el sistema. Las variables de shell son privadas para el shell que se está ejecutando actualmente , y NO se exportan (pasan) a ningún proceso secundario. Las variables de entorno se exportan a cualquier proceso hijo. "MYVAR = privado; exportar OURVAR = compartido; printenv" solo informaría "OURVAR" porque cuando el shell ejecuta el comando printenv, exporta OURVAR, pero no MYVAR.
CM
2
¡+1 al comentario de CM! ¡Nunca he escuchado la diferencia explicada tan simple y exactamente! Este comentario debería ser la respuesta.
Jesse the Wind Wanderer
48

Una variable de entorno está disponible globalmente, en un programa y sus programas secundarios. Una variable de shell solo está disponible en el shell actual. Para que una variable de shell esté disponible como una variable de entorno, use export VARNAME(sin dólar $).

Ejemplos de aclaración:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Otra forma de definir una variable de entorno:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Lekensteyn
fuente
No creo que esto sea correcto. exportno establece necesariamente una variable de entorno. stackoverflow.com/questions/7411455/…
Chris Stryczynski
3
@ChrisStryczynski exportestablece una variable de entorno para procesos secundarios. La publicación que ha vinculado no contradice esta respuesta, ¿podría aclarar por qué cree que está mal?
Lekensteyn
exportabsolutamente establece una variable de entorno
David Tonhofer
9

Hay una diferencia. Las variables de Shell y las variables de entorno lo explicarán mejor que yo, pero aquí hay un extracto:

Si se realiza un cambio en una variable de shell, se debe "exportar" explícitamente a la variable de entorno correspondiente para que cualquier subproceso bifurcado pueda ver el cambio. Recuerde que las variables de shell son locales al shell en el que se definieron.

Peter.O
fuente
Estoy comentando mi propia respuesta ... Me gusta mucho el enlace de Ayuda Ubuntu en la respuesta de Takkat ... (es mejor que la mía)
Peter.O
3
¡Además, tu enlace ya no funciona!
1

Variable de shell: Corto plazo, Aplicado solo a la instancia actual del shell, No aplicable en todo el sistema

Variable ambiental: uso a largo plazo, sistema válido en todo el mundo, permitido globalmente

Por convención, las variables de Shell tienen su nombre en minúsculas mientras Envn. Las variables se escriben en mayúsculas

Ashish
fuente
-1

Para responder a esta pregunta, primero intente comprender el alcance de una variable.

Cuando crea una nueva variable como SOME_ENV_VARIABLE="testing.txt"si SHELL scopeestuviera en el , eso significa que se puede acceder por esa instancia del shell donde el usuario está conectado. Cuando la instancia cambia, por ejemplo, abre un nuevo terminal o cambia el shell (por ejemplo, usted cambie a csh) no puede acceder a esa variable.

Cuando exporta esa variable como export SOME_ENV_VARIABLEesa variable ahora está disponible en el ámbito del entorno, eso significa que en ese caso si cambia el shell aún puede acceder a esa variable. Tratemos de entender con el siguiente ejemplo:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Analogía: supongamos que tiene un apartamento de dos habitaciones y lo está compartiendo con otro compañero de cuarto. Cualquiera puede acceder al área común, pero no a sus habitaciones, la variable de entorno es como el área común y la variable de concha es como la habitación, si desea algo en el área común, cualquiera puede acceder a ella, pero si la mantiene en su habitación, solo puede ser accedido por usted

Recuerde que si abre un nuevo terminal, no podrá acceder a ninguna de las variables porque está cambiando esa instancia . Para eso, debe agregar sus variables en cualquiera .profileo .bashrc(si está usando bash).

Vishrant
fuente