Cómo establecer variables de entorno en Bash

Hay más de un tipo de variables de entorno en Linux. Debes aprender cómo observarlas, crearlas para inicios de sesión locales y remotos, y hacer que sobrevivan a los reinicios.

Cuando inicias una ventana de la terminal y la shell dentro de ella, se hace referencia a una colección de variables. Esto para garantizar que la shell esté configurada correctamente.

Estas variables también aseguran que cualquier información a la que la ventana de la terminal y la shell puedan tener que referirse esté disponible. En conjunto, estas variables contienen configuraciones que definen el entorno que se encuentra dentro de la ventana de tu terminal. Asimismo, el aspecto de la línea de comandos. Entonces, naturalmente, se les conoce como variables de entorno.

Algunas variables de entorno son de todo el sistema o globales. Otras abarcan toda la sesión y solo tú puedes verlas. Otras no pueden hacer referencia a las variables de entorno de tu sesión.

Hay un tercer conjunto de variables de entorno definidas dentro de ña shell. La configuración regional, la zona horaria y el teclado. También el conjunto de directorios buscados cuando la shell intenta encontrar un comando y tu editor predeterminado se almacena en variables de entorno de la shell.

Te mostraremos cómo ver las variables de entorno que existen en tu sistema y describiremos cómo crear las tuyas propias. También te mostraremos cómo ponerlas a disposición de los procesos secundarios y ser persistentes en todos los reinicios.

Entornos y herencia

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

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

Si el proceso hijo es una shell, esa shell se inicializará a partir de tu propio conjunto de variables nuevas. Por lo tanto, si modificas la línea de comandos en la shell actual y luego inicias una shell hija, la shell hija no heredará la línea de comandos modificada del padre.

Variables del entorno global

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

  • SHELL: el nombre de la shell que se iniciará cuando abras una ventana de la terminal. En la mayoría de las distribuciones de Linux, esta será bash a menos que la cambies por defecto.
  • TERM: Las ventanas de la terminal son en realidad emulaciones de una terminal de hardware. Esto contiene el tipo de terminal de hardware que se emulará.
  • USER: 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 estabas antes de pasar al directorio de trabajo actual.
  • LS_COLORS: la lista de códigos de color utilizados por los diferentes tipos de archivos resaltados ls.
  • MAIL: Si el sistema mail se configuró en tu computadora Linux (de forma predeterminada, no lo está), esto mantendrá la ruta al buzón del usuario actual.
  • PATH: Una lista de directorios que la shell buscará para encontrar ejecutables de comandos.
  • LANG: el idioma, la localización y la configuración de codificación de caracteres.
  • HOME: el directorio de inicio del usuario actual.
  • _: La variable de entorno subrayado (_) contiene el último comando que se escribió.

Configuración

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

Un buen detalle es que puedes usar la tab completion para completar el nombre de la variable de entorno. Escribe algunas letras del nombre y presiona Tab. El nombre de la variable se completa con la shell. Si no sucede, deberás escribir algunas letras más para distinguir la variable de entorno de otros comandos con nombres que comienzan con esas mismas letras:

Para crear tus propias variables de entorno global, agrégalas al archivo /etc/environment. Tendrás que usar sudo para editar este archivo:

Para agregar una variable de entorno, debes escribir su nombre, un signo igual (=) y el valor que deseas que contenga la variable de entorno. No dejes espacio antes o después del signo igual (=). El nombre de la variable de entorno puede contener letras, un guion bajo (_) o números. Sin embargo, el primer caracter de un nombre no puede ser un número.

Si hay espacios en el valor, asegúrate de incluir el valor completo entre comillas (“).

Debes guardar el archivo y luego cerrar sesión y volver a iniciarla. Debes usar echo para probar que existe una nueva variable y contiene el valor que estableciste:

Usuarios

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

Para ver todas las variables de entorno a la vez, debes escribir printenv. Hay una gran cantidad de resultados, por lo que tiene sentido canalizarlos con sort y luego ingresarlos a less:

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

Podemos canalizar la salida con grep para buscar variables de entorno relacionadas con un tema en particular:

Variables de entorno de la Shell

Estas son algunas de las variables de entorno de la shell utilizadas en bash para dictar o registrar su comportamiento y funcionalidad. Algunos de los valores se actualizan a medida que utilizas ña terminal. Por ejemplo, la variable de entorno COLUMNS se actualizará para reflejar los cambios que puedas realizar en el ancho de la ventana de la terminal:

  • BASHOPTS: las opciones de línea de comandos que se utilizaron cuando bash se inició.
  • BASH_VERSION: el número de versión de bash como una cadena de palabras y números.
  • BASH_VERSINFO: la versión de bash como un dígito.
  • COLUMNS: el ancho actual de la ventana de la terminal.
  • DIRSTACK: los directorios que el comando ha agregado al conjunto de directorios con pushd.
  • HISTFILESIZE: número máximo de líneas permitidas en el archivo history.
  • HISTSIZE: Número de líneas de history permitidas en la memoria.
  • HOSTNAME: el nombre de host de la computadora.
  • IFS: El Internal Field Separator es utilizado para separar las entradas en la línea de comandos. Por defecto, este es un espacio.
  • PS1: La variable de entorno PS1 contiene la definición de la primaria, por defecto, y la línea de comandos. Se puede incluir un conjunto de tokens llamados secuencias de escape en la definición de línea de comandos. 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 la línea de comandos secundaria. La variable de entorno PS2 contiene la definición de esta solicitud secundaria, que, de forma predeterminada, es el símbolo mayor que (>).
  • SHELLOPTS: opciones de la shell que puedes configurar usando la opción set.
  • UID: el identificador de usuario del usuario actual.

Ejemplos:

Veamos algunas de estas variables de shell:

En aras de la exhaustividad, estos son los tokens que puedes usar en las definiciones de la línea de comandos:

  • \t: La hora actual, formateada como HH: MM: SS.
  • \d: La fecha actual, expresada como día de la semana, mes, fecha.
  • \n: un caracter de nueva línea.
  • \s: el nombre de su shell.
  • \W: El nombre de tu directorio de trabajo actual.
  • \w: la ruta a tu 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 una shell está numerado. Esto te permite ver el número del comando en tu línea de comandos. Esto no es lo mismo que el número que tendrá el comando en la lista history.
  • \$: Establece el caracter final de la solicitud en un signo de dólar ($) para un usuario normal y un símbolo hash (#) 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 variable de entorno PS1 en tu archivo .bashrc.

Crear variables de entorno de sesión

Para crear variables de entorno para tu propio uso, agrégalas al final de tu archivo .bashrc. Si deseas tener las variables de entorno disponibles para sesiones remotas, como las conexiones SSH, también deberás agregarlas a tu archivo .bash_profile.

El formato de la definición de la variable de entorno es el mismo para ambos archivos. Para agregar una definición a tu archivo .bash_profile, debes escribir esto en tu directorio de inicio:

Hemos agregado una variable de entorno llamada  INHERITED_VAR. Ten en cuenta la palabra “export” al comienzo de la línea.

Debes guardar y cerrar tu archivo después de que termines de editar. Puedes cerrar sesión y volver a iniciarla, o puedes hacer que la shell vuelva a leer el archivo .bash_profile con el comando punto (.) de esta manera:

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

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

Notarás que la definición de la variable de entorno INHERITED_VAR tenía la palabra “export” al comienzo de la línea. Esto significa que la variable de entorno será heredada por los procesos hijos de la shell actual.

Si iniciamos otro comando usando bash, podemos verificar las dos variables nuevamente, desde el interior de la shell hija:

Como puedes ver, INHERITED_VAR es accesible en la shell hija, pero LOCAL_VAR no lo es. Simplemente obtenemos una línea en blanco.

Aunque “export” agrega la parte de la variable de entorno al entorno que heredan los procesos hijos, INHERITED_VAR no es una variable de entorno global. Por ejemplo, el usuario mary no puede hacer referencia a ella:

Para cerrar nuestra sesión bash hija, utilizamos exit:

Scripts

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 la terminal:

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

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

El script puede ver la variable de entorno global WEBSITE y la variable de entorno exportada INHERITED_VAR. No puede acceder a LOCAL_VAR, aunque el script se esté ejecutando en la misma shell donde se creó la variable.

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

La variable de entorno se ha agregado al entorno de la shell actual y, por lo tanto, aparece en el entorno heredado por el script. El script también puede hacer referencia a esa variable de entorno.

Conexiones remotas

Las variables de entorno globales son accesibles para las sesiones de inicio de sesión remoto. Empero, si deseas que tus variables de entorno definidas localmente estén disponibles de forma remota, debes agregarlas a tu archivo .bash_profile. Puedes establecer la misma variable de entorno en los archivos .bashrc y  .bash_profile, con diferentes valores.

Esto podría ser tomado por un script, por ejemplo, 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 archivo .profile. También puede contener definiciones de variables de entorno. Sin embargo, el archivo .profile no se lee si el archivo .bash_profile está presente. Por lo tanto, lo más seguro y la forma más compatible con bash es usar el archivo .bash_profile)

Para editar el archivo .bash_profile, usaremos gedit nuevamente:

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

Debes guardar tus cambios y cerrar gedit.

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

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

El archivo .bash_profile se ha leído como parte de la inicialización del inicio de sesión remoto, y la variable de entorno INHERITED_VAR es accesible para nosotros y el script.

Desactivar una variable de entorno

Para desactivar una variable de entorno, debes usar el unset. Si desactivamos la variable de entorno global WEBSITE, y la variable de entorno exportada INHERITED_VAR, ya no estarán disponibles en la línea de comando. Tampoco estarán disponible en los procesos secundarios:

Un punto a tener en cuenta es que esto solo cambia la disponibilidad de variables de entorno globales para ti en esta sesión. Otra persona que haya iniciado sesión simultáneamente todavía podrá acceder a tu instancia de esa variable de entorno global. Tu instancia fue inicializada y leída del archivo /etc/environment durante tu proceso de inicio de sesión, y es independiente de la copia de la variable de cualquier otra persona.

Como ejemplo, el usuario mary aún puede acceder a la variable de entorno WEBSITE y leer su valor, aunque el usuario dave la tenga unset en su sesión:

Controlando el entorno

Las variables de entorno se pueden usar 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, un script puede llenar un entorno con un valor al que otros scripts pueden hacer referencia sin tener que escribirlos en un archivo.