Cómo establecer variables de entorno en Bash en Linux

Un terminal Linux estilizado con líneas de texto verde en una computadora portátil.
fatmawati achmad zaenuri / Shutterstock

Hay más de un tipo de variable de entorno en Linux. Aprenda a verlos, créelos para inicios de sesión locales y remotos y haga que sobrevivan a los reinicios.

Cómo funcionan las variables de entorno

Cuando inicia una ventana de terminal y el shell dentro de ella , se hace referencia a una colección de variables para garantizar que el shell esté configurado correctamente. Estas variables también garantizan que cualquier información a la que la ventana de terminal y el shell puedan necesitar hacer referencia esté disponible. En conjunto, estas variables contienen configuraciones que definen el entorno que se encuentra dentro de la ventana de su terminal, hasta el aspecto del símbolo del sistema. Entonces, naturalmente, se las conoce como variables de entorno.

Algunas variables de entorno son globales o de todo el sistema. Otros son para toda la sesión y solo usted puede verlos. Otros no pueden hacer referencia a las variables de entorno de su sesión. Hay un tercer conjunto de variables de entorno definidas dentro del shell. Su configuración regional, de zona horaria y de teclado, el conjunto de directorios buscados cuando el shell intenta encontrar un comando y su editor predeterminado, se almacenan en variables de entorno del shell.

Le mostraremos cómo ver las variables de entorno que existen en su sistema y describiremos cómo crear las suyas propias. También le mostraremos cómo ponerlos a disposición de los procesos secundarios y ser persistentes en los reinicios.

Ambientes y herencia

Cuando se inicia un shell, pasa por una fase de inicialización. Es en este punto que lee las variables de entorno que definen el entorno del shell.

Cuando un programa o comando se inicia desde ese shell, conocido como proceso hijo, hereda el entorno del proceso padre, ¡pero tenga cuidado! Como veremos, puede crear variables que no se agreguen a su entorno, por lo que no serán heredadas por un proceso hijo.

Si el proceso hijo es un shell, ese shell se inicializará a partir de su propio conjunto de variables nuevas. Por lo tanto, si modifica el símbolo del sistema en el shell actual y luego inicia un shell secundario, el shell secundario no heredará el símbolo del sistema modificado del padre.

Variables ambientales globales

Por convención, las variables de entorno reciben nombres en mayúsculas. Estas son algunas de las variables de entorno global y lo que representan los valores que contienen:

  • SHELL: el nombre del shell que se iniciará cuando abra una ventana de terminal. En la mayoría de las distribuciones de Linux,  esto será bash a  menos que lo cambie del predeterminado.
  • TÉRMINO: Las ventanas de terminal son en realidad emulaciones de un terminal de hardware. Contiene el tipo de terminal de hardware que se emulará.
  • USUARIO: El nombre de usuario de la persona actual que usa el sistema.
  • PWD: la ruta al directorio de trabajo actual.
  • OLDPWD: el directorio en el que se encontraba antes de pasar al directorio de trabajo actual.
  • LS_COLORS: La lista de códigos de color utilizados por los ls diferentes tipos de archivos resaltados .
  • CORREO: Si el mailsistema se ha configurado en su computadora Linux (de forma predeterminada, no lo está), esto mantendrá la ruta al buzón del usuario actual .
  • RUTA: Una lista de directorios en los que el shell buscará para encontrar ejecutables de comandos.
  • LANG: la configuración de idioma, localización y codificación de caracteres.
  • INICIO: el directorio de inicio del usuario actual.
  • _: La _variable de entorno de subrayado ( ) contiene el último comando que se escribió.
Relacionado:  Cómo montar y desmontar dispositivos de almacenamiento desde la terminal de Linux

Podemos ver para qué están configurados algunos de estos usando nada más sofisticado que  echo, que escribirá los valores en la ventana de terminal . Para ver el valor de una variable de entorno, debe agregar un signo de dólar ( $) al comienzo de su nombre.

Un buen detalle es que puede utilizar la función de tabulación para completar el nombre de la variable de entorno. Escriba algunas letras del nombre y presione Tab. El nombre de la variable se completa con el shell. Si eso no sucede, deberá escribir algunas letras más para distinguir la variable de entorno de otros comandos con nombres que comienzan con esas mismas letras:

echo $ SHELL
echo $ LANG
echo $ HOME
echo $ PWD

echo $ SHELL en una ventana de terminal

Para crear sus propias variables de entorno global , agréguelas al /etc/environmentarchivo. Deberá usar sudopara editar este archivo:

sudo gedit / etc / environment

sudo gedit / etc / environment en una ventana de terminal

Para agregar una variable de entorno, escriba su nombre, un signo igual ( =) y el valor que desea que mantenga la variable de entorno. No espacios antes o después del signo igual ( =). El nombre de la variable de entorno puede contener letras, un guión bajo ( _) o números. Sin embargo, el primer carácter de un nombre no puede ser un número.

Si hay espacios en el valor, asegúrese de incluir todo el valor entre comillas ( ").

El archivo / etc / environment se abrió en un editor y se agregó una nueva variable de entorno.

Guarde el archivo, cierre la sesión y vuelva a iniciarla. Úselo echopara probar que existe una nueva variable y tiene el valor que estableció:

echo $ SITIO WEB

echo $ WEBSITE en una ventana de terminal.

Debido a que es una variable de entorno global y está disponible para todos, el usuario marypuede hacer referencia a la variable de entorno la próxima vez que inicie sesión:

echo $ SITIO WEB

echo $ WEBSITE en una ventana de terminal.

Para ver todas las variables de entorno a la vez, escriba  printenv. Hay una gran cantidad de resultados, por lo que tiene sentido canalizarlos sorty luego en less:

printenv | ordenar | Menos

printenv |  ordenar |  menos en una ventana de terminal.

La lista ordenada de variables de entorno se muestra para nosotros en less.

lista ordenada de variables de entorno en menos en una ventana de terminal.

Podemos canalizar la salida greppara buscar variables de entorno relacionadas con un tema en particular .

printenv | grep GNOME

printenv |  grep GNOME en una ventana de terminal.

Variables de entorno de shell

Estas son algunas de las variables de entorno de shell que se utilizan  bashpara dictar o registrar su comportamiento y funcionalidad. Algunos de los valores se actualizan a medida que usa el terminal. Por ejemplo, la COLUMNSvariable de entorno se actualizará para reflejar los cambios que podría realizar en el ancho de la ventana de la terminal:

  • BASHOPTS: Las opciones de la línea de comandos que se usaron cuando bashse lanzó.
  • BASH_VERSION: el bash número de versión como una cadena de palabras y números.
  • BASH_VERSINFO: La bashversión como un dígito.
  • COLUMNAS: el ancho actual de la ventana de la terminal.
  • DIRSTACK: los directorios que se han agregado a la pila de directorios mediante el pushdcomando.
  • HISTFILESIZE: Número máximo de líneas permitidas en el  history archivo.
  • HISTSIZE: Número de líneas historypermitidas en la memoria.
  • HOSTNAME: el nombre de host de la computadora.
  • IFS: El interna Separador de campo  utiliza para introducir por separado en la línea de comandos. Por defecto, este es un espacio.
  • PS1: La PS1variable de entorno contiene la definición de la primaria, por defecto, y el símbolo del sistema. Se puede incluir un conjunto de tokens llamados secuencias de escape en la definición de su símbolo del sistema. Representan cosas como el host y el nombre de usuario, el directorio de trabajo actual y la hora.
  • PS2: cuando un comando abarca más de una línea y se esperan más entradas, se muestra el símbolo del sistema secundario. La PS2variable de entorno contiene la definición de este indicador secundario, que, de forma predeterminada, es el signo mayor que ( >).
  • SHELLOPTS: opciones de Shell que puede configurar usando la setopción.
  • UID: el identificador de usuario del usuario actual.
Relacionado:  ¿Qué es un TTY en Linux? (y cómo utilizar el comando tty)

Revisemos algunas de estas variables de shell:

echo $ BASH_VERSION
echo $ HOSTNAME
echo $ COLUMNS
echo $ HISTFILESIZE
echo $ UID

echo $ BASH_VERSION en una ventana de terminal.

En aras de la integridad, estos son los tokens que puede usar en las definiciones del símbolo del sistema:

  • \ t: la hora actual, formateada como HH: MM: SS.
  • \ d: La fecha actual, expresada como día de la semana, mes, fecha.
  • \ n: un carácter de nueva línea.
  • \ s: el nombre de su shell.
  • \ W: el nombre de su directorio de trabajo actual.
  • \ w: la ruta a su directorio de trabajo actual.
  • \ u: el nombre de usuario de la persona que inició sesión.
  • \ h: el nombre de host de la computadora.
  • \ #: Cada comando dentro de un shell está numerado. Esto le permite ver el número del comando en su símbolo del sistema. Este no es el mismo número que el comando tendrá en la historylista.
  • \ $: Establece el carácter final de la solicitud en un signo de dólar ( $) para un usuario normal y un símbolo de almohadilla ( #) para el usuario root. Esto funciona comprobando el UID del usuario. Si es cero, el usuario es root.

Encontrarás la definición de tu PS1variable de entorno en tu .bashrcarchivo.

Creación de variables de entorno de sesión

Para crear variables de entorno para su propio uso, agréguelas al final de su  .bashrcarchivo. Si desea tener las variables de entorno disponibles para sesiones remotas, como las conexiones SSH, también deberá agregarlas a su  .bash_profilearchivo.

El formato de la definición de la variable de entorno es el mismo para ambos archivos. Para agregar una definición a su  .bash_profilearchivo, escriba esto en su directorio de inicio:

gedit .bashrc

Archivo .bashrc cargado en un editor y se agregó una nueva variable de entorno como última línea del archivo.

Agregamos una variable de entorno llamada  INHERITED_VAR. Tenga en cuenta la palabra «exportar» al principio de la línea.

gedit .bashrc en una ventana de terminal.

Guarde y cierre su archivo después de terminar de editarlo. Puede cerrar la sesión y volver a iniciarla, o puede hacer que el shell vuelva a leer el .bash_profile archivo usando el comando dot ( .) de esta manera:

. .bashrc

.  .bashrc en una ventana de terminal.

Ahora, creemos una variable de entorno en la línea de comando:

LOCAL_VAR = "Esta sesión solamente"

LOCAL_VAL = "Esta sesión solo" en una ventana de terminal.

Si usamos echo, podemos ver que ambas variables de entorno son accesibles para nosotros:

echo $ LOCAL_VAR
echo $ INHERITED_VAR

echo $ LOCAL_VAR en una ventana de terminal.

Notará que la definición de la INHERITED_VARvariable de entorno tenía la palabra «exportar» al comienzo de la línea. Esto significa que los procesos secundarios del shell actual heredarán la variable de entorno. Si lanzamos otro usando el bashcomando, podemos verificar las dos variables nuevamente, desde dentro del shell secundario:

intento
echo $ LOCAL_VAR
echo $ INHERITED_VAR

golpe en una ventana de terminal

Como puede ver, INHERITED_VARes accesible en el shell secundario, pero LOCAL_VARno lo es. Simplemente obtenemos una línea en blanco.

Aunque «exportar» agrega la parte de la variable de entorno al entorno que heredan los procesos secundarios, INHERITED_VARno es una variable de entorno global. Por ejemplo, el usuario maryno puede hacer referencia a él:

echo $ INHERITED_VAR

echo $ INHERITED_VAR en una ventana de terminal.

Para cerrar nuestra bashsesión infantil , usamos exit:

salida

Los entornos heredados también afectan a los scripts. Aquí hay un script simple que escribe los valores de nuestras tres variables de entorno en la ventana de terminal:

#! / bin / bash

echo "SITIO WEB" $ SITIO WEB
echo "LOCAL_VAR" $ LOCAL_VAR
echo "INHERITED_VAR" $ INHERITED_VAR

Esto se guardó en un archivo llamado envtest.shy luego se hizo ejecutable con lo siguiente:

chmod + x envtest.sh

Cuando ejecutamos el script, puede acceder a dos de las tres variables de entorno:

./envtest.sh

./envtest.sh en una ventana de terminal.

El script puede ver la WEBSITEvariable de entorno global y la INHERITED_VARvariable de entorno exportada. No puede acceder  LOCAL_VAR, aunque el script se esté ejecutando en el mismo shell donde se creó la variable.

Relacionado:  Cómo conectarse a un servidor SSH desde Windows, macOS o Linux

Si es necesario, podemos exportar una variable de entorno desde la línea de comandos. Haremos eso con nuestro LOCAL_VAR, y luego ejecutaremos el script nuevamente:

exportar LOCAL_VAR
./envtest.sh

exportar LOCAL_VAR en una ventana de terminal.

La variable de entorno se ha agregado al entorno del shell actual, por lo que aparece en el entorno que hereda el script. El script también puede hacer referencia a esa variable de entorno.

Conexiones remotas

Las variables de entorno global son accesibles para las sesiones de inicio de sesión remoto, pero si desea que sus variables de entorno definidas localmente estén disponibles de forma remota, debe agregarlas a su .bash_profilearchivo. Puede establecer la misma variable de entorno en los archivos .bashrc.bash_profile, con valores diferentes. Esto podría ser recogido por un script, digamos, para modificar su comportamiento para las personas que usan el sistema de forma local o remota.

(A riesgo de confundir las cosas, también hay un .profilearchivo. También puede contener definiciones de variables de entorno. Sin embargo, el .profilearchivo no se lee si el .bash_profilearchivo está presente. Por lo tanto, lo más seguro y bashconforme a las normas es para usar el .bash_profilearchivo.)

Para editar el .bash_profilearchivo, usaremos geditnuevamente:

gedit .bash_profile

gedit .bash_profile en una ventana de terminal.

Vamos a agregar la misma variable de entorno con el mismo valor que usamos antes.

El archivo .bash_profile se abrió en un editor y se agregó una nueva variable de entorno.

Guarde sus cambios y cierre gedit.

En otra computadora, haremos una  SSH conexión con la computadora de prueba .

ssh [email protected]

ssh dave@howtogeek.local en una ventana de terminal.

Una vez que estemos conectados, ejecutaremos el script una vez más:

./envtest.sh

./envtest.sh en una ventana de terminal.

El .bash_profilearchivo se ha leído como parte de la inicialización del inicio de sesión remoto, y INHERITED_VARnosotros y el script podemos acceder a la variable de entorno.

Desarmar una variable de entorno

Para desarmar una variable de entorno, use el unsetcomando . Si anulamos la configuración de la variable de entorno global  WEBSITE, y la variable de entorno exportada  INHERITED_VAR, ya no estarán disponibles en la línea de comandos ni en los procesos secundarios:

desarmar SITIO WEB
no establecido INHERITED_VAR
./envtest.sh
echo $ SITIO WEB

Desarmar una variable de entorno en Bash en Linux.

Un punto a tener en cuenta es que esto solo cambia la disponibilidad de las variables de entorno global para usted en esta sesión. Otra persona que haya iniciado sesión simultáneamente podrá acceder a su instancia de esa variable de entorno global. Su instancia se inicializó y leyó del /etc/environmentarchivo durante su proceso de inicio de sesión, y es independiente de la copia de la variable de cualquier otra persona.

Como ejemplo, el usuario maryaún puede acceder a la WEBSITEvariable de entorno y leer su valor, aunque el usuario lo davetenga unseten su sesión:

echo $ SITIO WEB

echo% WEBSITE en una ventana de terminal.

Control ambiental

Las variables de entorno se pueden utilizar para que los scripts y las aplicaciones sepan cómo deben comportarse. Se pueden usar para almacenar configuraciones o pequeñas cantidades de datos. Por ejemplo, una secuencia de comandos puede poblar un entorno con un valor que puede ser referenciado por otras secuencias de comandos sin tener que escribirlas en un archivo.