Cómo establecer variables de entorno en Bash en Linux

  • Dave McKay
  • @TheGurkha
  • 28 de abril de 2020, 8:00am EDT
Un terminal Linux estilizado con líneas de texto verde en un portátil.
fatmawati achmad zaenuri/

Hay más de un tipo de variable de entorno en Linux. Aprende a verlas, a crearlas para inicios de sesión locales y remotos, y a hacer que sobrevivan a los reinicios.

Cómo funcionan las variables de entorno

Cuando lanzas una ventana de terminal y el shell dentro de ella, se hace referencia a una colección de variables para asegurar que el shell está configurado correctamente. Estas variables también aseguran que cualquier información a la que la ventana de terminal y el shell puedan necesitar referirse esté disponible. En conjunto, estas variables contienen configuraciones que definen el entorno que se encuentra dentro de la ventana de la terminal, hasta el aspecto de la línea de comandos. Así que, naturalmente, se denominan variables de entorno.

Algunas variables de entorno son de todo el sistema, o globales. Otras son de sesión y sólo las puedes ver tú. Otras no pueden hacer referencia a tus variables de entorno de sesión. Hay un tercer conjunto de variables de entorno definidas dentro del shell. Su configuración de localización, zona horaria y teclado, el conjunto de directorios buscados cuando el shell intenta encontrar un comando, y su editor predeterminado, se almacenan en las variables de entorno del shell.

Publicidad

Vamos a mostrarle cómo ver las variables de entorno que existen en su sistema, y describiremos cómo crear las suyas propias. También te mostraremos cómo hacer que estén disponibles para los procesos hijos y que sean persistentes a través de los reinicios.

Entornos y herencia

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

Cuando se lanza un programa o comando desde ese shell -conocido como proceso hijo- hereda el entorno del proceso padre, pero ¡cuidado! Como veremos, se pueden crear variables que no se añaden al 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 y fresco conjunto de variables. Por lo tanto, si usted altera el símbolo del sistema en el shell actual, y luego lanza un shell hijo, el shell hijo no heredará el símbolo del sistema modificado del padre.

Variables de entorno globales

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

  • SHELL: El nombre del shell que se lanzará al abrir una ventana de terminal. En la mayoría de las distribuciones de Linux, este será bash a menos que lo hayas cambiado del predeterminado.
  • TERM: Las ventanas de terminal son en realidad emulaciones de una terminal de hardware. Esto contiene el tipo de terminal de hardware que se emulará.
  • USUARIO: El nombre de usuario de la persona actual que utiliza 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 colores que utiliza el ls para resaltar los diferentes tipos de archivos.
  • MAIL: Si el sistema mail ha sido configurado en su ordenador Linux (por defecto, no lo está), esto contendrá la ruta al buzón del usuario actual.
  • PATH: Una lista de directorios en los que el 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 del guión bajo (_) contiene el último comando que se escribió.

Relacionado: Cómo usar pushd y popd en Linux

Publicidad

Podemos ver a qué se ajustan algunas de ellas usando nada más sofisticado que echo, que escribirá los valores en la ventana de la terminal. Para ver el valor de una variable de entorno, es necesario añadir un signo de dólar ($) al comienzo de su nombre.

Un buen detalle es que puedes usar el completador de tabulaciones para rellenar el nombre de la variable de entorno por ti. Escriba algunas letras del nombre y pulse el tabulador. El nombre de la variable es completado por el shell. Si eso no ocurre, tendrás que escribir unas cuantas letras más para distinguir la variable de entorno de otros comandos con nombres que empiezan por esas mismas letras:

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

Eco $SHELL en una ventana de terminal

Para crear tus propias variables de entorno globales, añádelas al archivo /etc/environment. Tendrás que usar sudo para editar este archivo:

sudo gedit /etc/environment

sudo gedit /etc/environment en una ventana de terminal

Publicidad

Para añadir una variable de entorno, escribe su nombre, un signo de igualdad (=), y el valor que quieres que tenga la variable de entorno. No dejes 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 encerrar todo el valor entre comillas (").

El archivo /etc/environment abierto en un editor y una nueva variable de entorno siendo añadida.

Guarda el archivo, y luego cierra la sesión y vuelve a entrar. Utiliza echo para comprobar que la nueva variable existe y mantiene el valor que has establecido:

echo $WEBSITE

Echo $WEBSITE en una ventana de terminal.

Como es una variable de entorno global, y está disponible para todo el mundo, la usuaria mary puede hacer referencia a la variable de entorno cuando vuelva a iniciar sesión:

echo $WEBSITE

echo $WEBSITE en una ventana de terminal.

Publicidad

Para ver todas las variables de entorno a la vez, escribe printenv. Hay mucha salida, así que tiene sentido canalizarla a través de sort, y luego en less:

printenv | sort | less

printenv | sort | less en una ventana de terminal.

La lista ordenada de variables de entorno se nos muestra en less.

Lista ordenada de variables de entorno en less en una ventana de terminal.

Podemos canalizar la salida a través de grep para buscar variables de entorno relacionadas con un tema concreto.

printenv | grep GNOME

printenv | grep GNOME en una ventana de terminal.

Relacionado: Cómo editar archivos de texto gráficamente en Linux con gedit

Variables de entorno del shell

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

  • BASHOPTS: Las opciones de la línea de comandos que se utilizaron cuando se lanzó bash.
  • BASH_VERSION: El bash número de versión como una cadena de palabras y números.
  • BASH_VERSINFO: La bash versión como un dígito.
  • COLUMNAS: El ancho actual de la ventana del terminal.
  • DIRSTACK: Los directorios que se han añadido a la pila de directorios mediante el comando pushd.
  • HISTFILESIZE: Número máximo de líneas permitidas en el archivo history.
  • HISTSIZE: Número de líneas de history permitidas en memoria.
  • HOSTNAME: El nombre de host del ordenador.
  • IFS: El separador de campo interno utilizado para separar la entrada en la línea de comandos. Por defecto, es un espacio.
  • PS1: La variable de entorno PS1 contiene la definición del prompt primario, por defecto, y del prompt de comandos. Un conjunto de tokens llamados secuencias de escape puede ser incluido en la definición de su símbolo del sistema. Representan cosas como el nombre de host y de usuario, el directorio de trabajo actual y la hora.
  • PS2: Cuando un comando abarca más de una línea y se espera más entrada, se muestra el prompt de comando secundario. La variable de entorno PS2 contiene la definición de este indicador secundario, que, por defecto, es el signo mayor que (>).
  • SHELLOPTS: Las opciones del shell que se pueden establecer mediante la opción set.
  • UID: El identificador de usuario del usuario actual.
  • Relacionado: Cómo usar pushd y popd en Linux

    Veamos algunas de estas variables del shell:

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

Eco $BASH_VERSION en una ventana de terminal.

Publicidad

Para completar, aquí están los tokens que puedes usar en las definiciones del símbolo del sistema:

  • \t: La hora actual, formateada como HH:MM:SS.
  • \N-D: La fecha actual, expresada como día de la semana, mes, fecha.
  • \n: Un carácter de nueva línea.
  • \N-S: El nombre de su shell.
  • \W: El nombre de su directorio de trabajo actual.
  • \w: La ruta de acceso a su directorio de trabajo actual.
  • \u: El nombre de usuario de la persona que ha iniciado la sesión.
  • \N – El nombre de host del ordenador: El nombre de host de la computadora.
  • \N – Cada comando dentro de un shell está numerado. Esto le permite ver el número del comando en su símbolo del sistema. Esto no es lo mismo que el número que tendrá el comando en la history lista.
  • \$: Establece el carácter final del prompt en un signo de dólar ($) para un usuario normal, y un símbolo de hash (#) para el usuario root. Esto funciona comprobando el UID del usuario. Si es cero, el usuario es root.

La definición de tu PS1 variable de entorno la encontrarás en tu archivo .bashrc.

Creación de variables de entorno de la sesión

Para crear variables de entorno para tu propio uso, añádelas al final de tu archivo .bashrc. Si quieres que las variables de entorno estén disponibles para las sesiones remotas, como las conexiones SSH, tendrás que añadirlas también a tu archivo .bash_profile.

El formato de la definición de la variable de entorno es el mismo para ambos archivos. Para añadir una definición a tu archivo .bash_profile, escribe esto en tu directorio principal:

gedit .bashrc

.Archivo bashrc lodaed en un editor y una nueva variable de entorno añadido como la última línea en el archivo.

Publicidad

Hemos añadido una variable de entorno llamada INHERITED_VAR. Fíjate en la palabra «export» al principio de la línea.

gedit .bashrc en una ventana de terminal.

Guarda y cierra tu archivo cuando termines de editarlo. Puedes cerrar la sesión y volver a entrar, o puedes hacer que el shell vuelva a leer el archivo .bash_profile usando el comando dot (.) así:

. .bashrc

. .bashrc en una ventana de terminal.

Ahora, vamos a crear una variable de entorno en la línea de comandos:

LOCAL_VAR="This session only"

LOCAL_VAL="Sólo esta sesión" en una ventana de terminal."This session only" in a terminal window.

Si utilizamos 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.

Publicidad

Notarás que la definición de la variable de entorno INHERITED_VAR tenía la palabra «export» al principio de la línea. Esto significa que la variable de entorno será heredada por los procesos hijos del shell actual. Si lanzamos otro usando el comando bash, podemos comprobar las dos variables de nuevo, desde dentro del shell hijo:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

bash en una ventana de terminal

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

Aunque «exportar» añade 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 referenciarla:

echo $INHERITED_VAR

echo $INHERITED_VAR en una ventana de terminal.

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

exit

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

#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Publicidad

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

chmod +x envtest.sh

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

./envtest.sh

./envtest.sh en una ventana de terminal.

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 el mismo shell donde se creó la variable.

Si lo necesitamos, podemos exportar una variable de entorno desde la línea de comandos. Lo haremos en nuestro LOCAL_VAR, y luego ejecutaremos el script de nuevo:

export LOCAL_VAR
./envtest.sh

exportar LOCAL_VAR en una ventana de terminal.

Publicidad

La variable de entorno se ha añadido 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 globales son accesibles para las sesiones de inicio de sesión remotas, pero si quieres que tus variables de entorno definidas localmente estén disponibles de forma remota, debes añadirlas a tu archivo .bash_profile. Puedes establecer la misma variable de entorno en los archivos .bashrc y .bash_profile, con valores diferentes. Esto podría ser recogido por un script, por ejemplo, para modificar su comportamiento para las personas que utilizan 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 de cumplir con bash– es utilizar el archivo .bash_profile.)

Para editar el archivo .bash_profile, usaremos de nuevo gedit:

gedit .bash_profile

gedit .bash_profile en una ventana de terminal.

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

El archivo .bash_profile abierto en un editor con una nueva variable de entorno añadida.

Guarda los cambios y cierra gedit.

Publicidad

En otro ordenador, haremos una SSH conexión con el ordenador de prueba.

ssh [email protected]

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

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

./envtest.sh

./envtest.sh en una ventana de terminal.

El archivo .bash_profile ha sido 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 se utiliza el comando unset. Si desestablecemos 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 hijos:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Desactivar una variable de entorno en Bash en Linux.

Un punto a tener en cuenta es que esto sólo cambia la disponibilidad de las variables de entorno globales para ti en esta sesión. Otra persona que haya iniciado sesión simultáneamente podrá seguir accediendo a su instancia de esa variable de entorno global. Su instancia fue inicializada y leída desde el archivo /etc/environment durante su proceso de inicio de sesión, y es independiente de la copia de la variable de cualquier otra persona.

Publicidad

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

echo $WEBSITE

Eco %WEBSITE en una ventana de terminal.

Control de entorno

Las variables de entorno se pueden utilizar para que los scripts y las aplicaciones sepan cómo deben comportarse. Pueden utilizarse para almacenar configuraciones o pequeñas cantidades de datos. Por ejemplo, un script puede rellenar un entorno con un valor que puede ser referenciado por otros scripts sin tener que escribirlos en un archivo.

Dave McKay
Dave McKay utilizó por primera vez los ordenadores cuando la cinta de papel perforada estaba de moda, y ha estado programando desde entonces. Tras más de 30 años en el sector de la informática, ahora es un periodista tecnológico a tiempo completo. A lo largo de su carrera, ha trabajado como programador independiente, director de un equipo internacional de desarrollo de software, gestor de proyectos de servicios informáticos y, más recientemente, como responsable de protección de datos. Dave es un evangelista de Linux y defensor del código abierto.Read Full Bio »

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *