Variables de Shell
Las variables de shell son variables cuyo alcance se encuentra en la sesión de shell actual, por ejemplo, en una sesión de shell interactiva o un script.
Puede crear una variable de shell asignando un valor a un nombre no utilizado:
var="hello"
El uso de variables de shell es hacer un seguimiento de los datos en la sesión actual. Las variables de shell generalmente tienen nombres con letras minúsculas.
Variables de entorno
Una variable de entorno es una variable de shell que se ha exportado. Esto significa que será visible como una variable, no solo en la sesión de shell que lo creó, sino también para cualquier proceso (no solo shells) que se inicie desde esa sesión.
VAR="hello" # shell variable created
export VAR # variable now part of the environment
o
export VAR="hello"
Una vez que se ha exportado una variable de shell, permanece exportada hasta que se desarma, o hasta que su "propiedad de exportación" se elimina (con export -n
in bash
), por lo que generalmente no es necesario volver a exportarla. Desarmar una variable conunset
elimina (no importa si es una variable de entorno o no).
Las matrices y los hashes asociativos en bash
y otros shells no se pueden exportar para convertirse en variables de entorno. Las variables de entorno deben ser variables simples cuyos valores son cadenas, y a menudo tienen nombres que consisten en letras mayúsculas.
El uso de variables de entorno es para realizar un seguimiento de los datos en la sesión de shell actual, pero también para permitir que cualquier proceso iniciado tome parte de esos datos. El caso típico de esto es la PATH
variable de entorno, que puede establecerse en el shell y luego ser utilizada por cualquier programa que desee iniciar programas sin especificar una ruta completa a ellos.
La colección de variables de entorno en un proceso a menudo se denomina "el entorno del proceso". Cada proceso tiene su propio entorno.
Las variables de entorno solo se pueden "reenviar", es decir, un proceso hijo nunca puede cambiar las variables de entorno en su proceso padre, y aparte de configurar el entorno para un proceso hijo al iniciarlo, un proceso padre no puede cambiar el entorno existente de un proceso hijo
Las variables de entorno se pueden enumerar con env
(sin ningún argumento). Aparte de eso, aparecen igual que las variables de shell no exportadas en una sesión de shell. Esto es un poco especial para el shell ya que la mayoría de los otros lenguajes de programación no suelen mezclar variables "ordinarias" con variables de entorno (ver más abajo).
env
también se puede usar para establecer los valores de una o varias variables de entorno en el entorno de un proceso sin establecerlas en la sesión actual:
env CC=clang CXX=clang++ make
Esto comienza make
con la variable de entorno CC
establecida en el valor clang
y CXX
establecida enclang++
.
También se puede usar para limpiar el entorno de un proceso:
env -i bash
Este se inicia bash
pero no transfiere el entorno actual al nuevo bash
proceso (que todavía se tienen las variables de entorno, ya que crea otros nuevos desde sus secuencias de comandos shell de inicialización).
Ejemplo de diferencia
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
Otros idiomas
Hay funciones de biblioteca en la mayoría de los lenguajes de programación que permiten obtener y configurar las variables de entorno. Tenga en cuenta que, dado que las variables de entorno se almacenan como una simple relación clave-valor, generalmente no son "variables" del lenguaje. Un programa puede obtener el valor (que siempre es una cadena de caracteres) correspondiente a una clave (el nombre de la variable de entorno), pero luego tendrá que convertirlo a un entero o cualquier tipo de datos que el lenguaje espera que tenga el valor.
En C, las variables de entorno pueden ser accedidas usando getenv()
, setenv()
, putenv()
y unsetenv()
. Las variables creadas con estas rutinas se heredan de la misma manera por cualquier proceso que inicie el programa C.
Otros lenguajes pueden tener estructuras de datos especiales para lograr lo mismo, como el %ENV
hash en Perl o la ENVIRON
matriz asociativa en la mayoría de las implementaciones de awk
.