ENVVARS (variables de entorno) en GNU/Linux

Publicado por Diego Córdoba en

En este post veremos qué son las envvars o variables de entorno en GNU/Linux, jugaremos con carga y lectura de valores, aprenderemos a exportar variables, y a cargar valores predeterminados para todo el sistema.

Anteriormente hemos realizado una introducción a variables de entorno en terminal de comandos, y profundizamos en su uso dentro de aplicaciones Python.

Lo cierto es que las variables de entorno son una herramienta muy común y de mucha utilidad dentro de un sistema GNU/Linux.

Además, info de interés para nuestros alumnos, variables de entorno es uno de los temas requeridos para obtener la certificación internacional LPIC-1. De más está decir que este post añade documentación a nuestro curso de Administración GNU/Linux orientado a dicha certificación 🙂

Introducción a las envvars o variables de entorno en GNU/Linux

Las envvars o variables de entorno en GNU/Linux, almacenan información específica del sistema, tal como el nombre de usuario autenticado en una shell, el directorio HOME por defecto de ese usuario, o la ruta de búsqueda que usa la shell para encontrar los binarios correspondientes a los comandos que ejecutamos.

Las variables de entorno predefinidas en nuestro sistema son muchas, y pueden listarse de varias maneras, entre ellas, ejecutando el comando env, o printenv, o set sin argumentos.

La lista resultante tendrá una forma similar a esta captura:

envvars en GNU/Linux env

La lista se compone de pares clave=valor, y cada uno de esos valores puede ser accedido independientemente utilizando alguna de las siguientes alternativas:

╭─diego@cryptos in ~
╰$ echo $HOME
/home/diego
╭─diego@cryptos in ~
╰$ printenv HOME
/home/diego

Las variables de entorno almacenan, como nombre lo indica, el entorno de la aplicación que estemos corriendo, por defecto, la shell.

Veamos un ejemplo prácticos. Si ejecutamos el comando «ls» en nuestra shell, obtendremos una lista de todos los elementos del directorio actual, verdad?

Ahora bien, ¿cómo sabe la shell qué binario ejecutar cuando corremos «ls«?

Podemos obtener la ruta completa al binario del comando «ls» usando herramientas como which o whereis:

envvars en GNU/Linux path whereis wich

Cargando variables de entorno

La asignación de valores a variables de entorno tiene la forma «CLAVE=valor«. Si bien no es obligatorio que el nombre de la variable esté en mayúsculas, sí es una convención, por lo que es recomendable utilizarla.

Veamos un ejemplo:

envvars en GNU/Linux definicion

Ahora, podemos eliminar la variable que acabamos de crear utilizando el comando unset:

envvars en GNU/Linux lectura

Ahora un nuevo ejemplo… qué ocurre con el comando printenv que utilizamos antes para mostrar el contenido de una variable? Veamos esta captura:

Como se ve, podemos ver el contenido de la variable utilizando el comando echo, pero no podemos verla utilizando printenv. En el siguiente apartado veremos por qué.

Exportando envvars en GNU/Linux

Cuando cargamos una variable de entorno dentro de una shell, dicha variable no podrá ser accedidas por procesos hijos de dicha shell.

Un ejemplo es el proceso printenv, que no lee la variable directamente usando el operador $, sino que la trae desde el entorno del proceso padre.

Para que el proceso hijo pueda acceder a dicha variable debemos primero exportarla. Esto puede realizarse directamente al cargar la variable, o luego, una vez que la variable ya tiene valor, utilizando el comando export (el primer caso se ilustra en las líneas 1 y 2, el segundo en la línea 4.

NUEVA_VARIABLE="hola mundo"
export NUEVA_VARIABLE
# o
export NUEVA_VARIABLE="hola mundo"

Ahora veamos si funciona como debe:

Un ejemplo más claro puede ser lanzar una shell como proceso hijo de la shell anterior. El proceso hijo no podrá acceder a la variable, incluso si usamos echo.

Veamos el caso fallido:

subshell envvars en GNU/Linux

Y por supuesto, el caso donde sí funciona:

Hace un tiempo grabé un screencast (sin audio) para el canal de youtube de @JuncoTIC, lo comparto por acá mostrando este mismo procedimiento:

Igual que en el caso anterior, el comando unset elimina la variable, aunque ésta esté exportada al entorno.

Adicionalmente, existe una forma de «pasarle» una variable a un proceso hijo sin necesidad de exportarla al entorno. Esto puede ser útil cuando queremos lanzar una aplicación con valores diferente para las mismas variables del entorno actual (proceso padre).

Veamos los siguientes dos ejemplos, un proceso printenv accediendo al contenido de la variable sin haberla exportado, y una subshell:

export y printenv

Algunas envvars interesantes en GNU/Linux

Y hablando de subshells…

Cada vez que entramos a una subshell, es decir, ejecutamos un intérprete de comandos dentro de otro, se incrementa el valor de la variable SHLVL (SHell LeVeL).

shlvl

PS1: El prompt de nuestra shell:

La variable de entorno PS1 almacena el formato de prompt de nuestra shell. Veamos dos ejemplos. El primero, el formato de prompt que yo estoy usando en zsh, y el segundo, el que uso por default en bash:

ps1

Sin entrar en detalle, la primer configuración es la que permite mostrar el prompt con ese dibujo lineal hacia abajo, el nombre de usuario (%n), el hostname (%m), el directorio en el cual estoy trabajando, y la rama de git sobre la que estoy realizando cambios en el caso de que el directorio de trabajo sea a su vez un repositorio Git (no pregunten cómo hace lo de git porque no me he sentado a analizar las funciones xD).

El segundo ejemplo muestra el usuario (\u), el hostname (\h), y el resto es similar a lo mostrado en zsh, solamente que en bash los modificadores son diferentes.

En Internet hay infinidad de ejemplos de prompts tanto para Bash como para zsh, que pueden aplicarse.

ps1 envvars en GNU/Linux

Otras variables que pueden ser de interés:

  • DESKTOP_SESSION: muestra la sesión de entorno gráfico que estamos usando.
  • DISPLAY: muestra el identificador de pantalla donde está corriendo el proceso.
  • GTK_*: variables con información de control de entorno GTK.
  • HOME: directorio personal del usuario actual.
  • LANGUAGE: configuración de lenguaje predeterminado.
  • LC_*: configuración de locales.
  • LOGNAME: nombre de usuario de login del usuario actual.
  • PATH: ruta o rutas donde el intérprete de comandos va a buscar los binarios de los comandos que ejecutemos.
  • SHELL: binario del intérprete de comandos que estamos usando.
  • HISTFILE: esta variable almacena la ruta al archivo de texto que guarda el historial de comandos de nuestro intérprete.

Existen más variables, incluso puede que muchas cambien entre diferentes sistemas. La lista completa puede obtenerse ejecutando el comand env, o printenv sin argumentos. El comando set sin argumentos también muestra todas las variables de entorno, sumando aquellas que no están exportadas, pero que sí están definidas para el proceso actual.

Cambios persistentes de envvars en GNU/Linux

Todo lo que hemos expuesto hasta ahora no tiene valor si abrimos una nueva terminal, menos si reiniciamos la computadora.

Cuando abrimos un intérprete de comandos siempre se cargan configuraciones predeterminadas de variables de entorno.

Por ejemplo, si modificamos el prompt cambiando el valor de PS1, lo veremos inmediatamente, pero si cerramos la terminal y abrimos otra, veremos que el prompt vuelve a ser el original.

Si queremos que el cambio sea persistente tenemos que modificar las configuraciones predeterminadas del intérprete de comandos, generalmente, modificando el archivo de configuración de perfil.

Por ejemplo, si queremos modificar la variable PS1, o simplemente añadir la variable NUEVA_VARIABLE con el valor «hola mundo» de manera persistente, deberemos cargar la siguiente línea:

export NUEVA_VARIABLE="hola mundo"

En el archivo de configuración inicial de nuestro intérprete de comandos, por ejemplo, ~/.bashrc para Bash, o ~/.zshrc para ZSH.

Conclusiones

Hemos llegado al final!!

Es un tema muy amplio este de las envvars (variables de entorno) en GNU/Linux, y permiten una enorme flexibilidad a la hora de configurar nuestra shell y las aplicaciones que lanzamos desde la misma.

Hemos introducido los conceptos de variables de entorno, cómo leer el entorno de nuestra shell, cómo modificarlo localmente y mediante export, y cómo hacerlo de forma persistente y global cargando las configuraciones iniciales de nuestro intérprete de comandos.

La gestión de variables de entorno es muy utilizada para parametrizar nuestros scripts y otras aplicaciones que ejecutemos desde la shell, como scripts Python.

Además, es tema obligado para certificar LPIC-1, por lo que está añadido al curso de certificación 🙂

Espero que les sea útil

Hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Linux

Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador