Volver al blog

Cómo leer y configurar variables de entorno y de shell en un VPS Linux

Cómo leer y configurar variables de entorno y de shell en un VPS Linux

La mayoría de la comunidad tecnológica disfruta interactuando con los sistemas a través de la interfaz de línea de comandos (CMD) o shell. Generalmente, esto facilita su trabajo. Por ejemplo, puede crear un comando de shell que ejecute varias tareas automáticamente en lugar de tener que hacer clic en varios botones de una interfaz gráfica de usuario (GUI).

Cuando inicia un programa de shell o CMD, este recopila varias piezas de información. Esta información define cómo accede el programa a los recursos subyacentes del sistema, así como su comportamiento general. Puede almacenarla en un lugar llamado entorno. El entorno consta de cadenas que representan pares clave-valor. En este tutorial, utilizaremos Ubuntu 20.04 VPS como ejemplo para guiarle mientras configura variables de entorno o de shell. La guía también debería aplicarse a otras distribuciones de Linux.

¿Cuál es la diferencia entre las variables de entorno y las variables de shell?

Cuando inicia una sesión, se recopila información de los archivos de configuración y ajustes del sistema. Luego, esta queda disponible para el proceso de shell y sus procesos secundarios. Esta información es un conjunto de pares clave-valor con este formato:

Los nombres de las variables, es decir, las claves, distinguen entre mayúsculas y minúsculas. Sin embargo, se acepta convencionalmente tenerlas en MAYÚSCULAS. Esto le ayuda a distinguirlas en otros contextos. Con el carácter de dos puntos ‘:’ puede asignar múltiples valores a la misma variable. También es importante asegurarse de no dejar un espacio alrededor del =. Las claves son las variables y se clasifican en dos: variables de entorno y variables de shell. Las variables de entorno contienen todas las variables definidas a nivel de sistema y están disponibles para todos los shells o procesos secundarios. Ayudan a pasar información a los procesos que inicia a través de los comandos de shell. Las variables de shell incluyen solo las variables definidas en la sesión de shell específica. Además, incluyen solo las variables disponibles exclusivamente dentro de su instancia de shell.

Listar variables de entorno y de shell

Por defecto, la terminal proporciona dos comandos para listar las variables de entorno y de shell: env o printenv. Muestran la misma información en su estado predeterminado. Aquí hay una salida de muestra de estos comandos:

Usando env:

environment variables Environmental and Shell Variables

Usando printenv:

printenv

Como puede ver, la salida es la misma. La diferencia radica en cuando desea el valor de una clave específica. Ahí es cuando usará printenv con el nombre de la variable:

printenv shell

Para ver múltiples valores, puede pasar más de un argumento al comando printenv. Los valores aparecerán en el orden en que ingresó los argumentos:

printenv multiple commands

También puede usar el comando echo con el nombre de la variable para mostrar el valor de una variable:

echo variable

El comando env le permite modificar el entorno en el que se ejecutan los programas pasando definiciones de variables en una sintaxis como:

Esto le permite anular valores o establecer nuevos valores que puedan ser utilizados por el proceso secundario. Los comandos printenv y env listan las variables de entorno como se vio anteriormente. Estas ya estaban definidas para los procesos del sistema. Si desea ver una lista de variables de shell, puede usar el comando set. Escribir set sin ninguna variable devolverá una lista de todas las variables de entorno, variables de shell, variables locales y funciones de shell:

set command Environmental and Shell Variables

Las variables pueden ser demasiadas. Si es necesario, puede paginarlas usando el comando:

Puede limpiar aún más la salida especificando que el comando set se ejecute en POSIX, evitando así que se impriman las funciones de shell. Aquí ejecutamos en un subshell (instancia separada del procesador de comandos) para evitar que el comando cambie el entorno actual:

Lo anterior enumera todos los comandos de entorno y de shell disponibles en el sistema. Puede recortar la salida utilizando el siguiente comando para intentar obtener solo las variables de shell:

Una salida de ejemplo del comando anterior es:

lists all environmental and shell commands Environmental and Shell Variables

Aunque el comando puede incluir algunas variables de entorno, le ayudará a diferenciar entre las variables de shell y las de entorno. Esto se debe a que el comando set encierra entre comillas los valores de las variables, mientras que los comandos printenv y env no lo hacen. Las variables de shell son útiles para establecer valores persistentes para las sesiones, sin escribir permanentemente los cambios en los archivos.

Variables de entorno comunes

USER – El usuario actualmente conectado.
SHELL – El shell que interpretará los comandos que introduzca. El valor predeterminado es bash, pero puede cambiarlo.
HOME – Directorio de inicio del usuario actual.
TERM – Especifica el tipo de terminal a emular. Muestra la terminal emulada actual.
PWD – El directorio de trabajo actual.
OLDPWD – El directorio de trabajo anterior. Esto ayuda al shell a cambiar al directorio anterior cuando introduce el comando de cambio de directorio como cd.

EDITOR – El editor de archivos predeterminado cuando escribe edit en su terminal.
LS_COLORS – Define los códigos de color utilizados para añadir salida coloreada cuando introduce el comando ls. Ayuda a diferenciar los tipos de archivos y proporciona información a los usuarios.
LOGNAME – El nombre del usuario actual.
MAIL – Define la ruta al buzón de correo del usuario actual.
LANG – Define la configuración regional actual.
PATH – Especifica una lista de directorios en los que buscar al ejecutar los comandos. Durante la ejecución de un comando, el sistema busca a través de estos directorios y utiliza el primer ejecutable encontrado.
_ – El último comando ejecutado.

Variables de shell comunes:

BASH_VERSION – La versión de bash, en formato legible para humanos.
BASH_VERSINFO – La versión de bash, en formato legible por máquina.
BASHOPTS – La lista de opciones que se utilizaron cuando se ejecutó bash. Útil para determinar si el entorno del shell funcionará como espera.

COLUMNS – El número de columnas de ancho que se utilizan para mostrar la salida en la pantalla.
DIRSTACK – La pila de directorios que están disponibles con los comandos pushd y popd.
HOSTNAME – El nombre de host de la computadora en este momento.
HISTFILESIZE – Número de líneas de historial de comandos almacenadas en un archivo.
HISTSIZE – Número de líneas de historial de comandos permitidas en memoria.
IFS – El separador de campos interno para separar la entrada en la línea de comandos. Es un espacio por defecto.
SHELLOPTS-Se utiliza para establecer las opciones del shell.
UID-El UID del usuario actual.
PS1– La definición del indicador de comando principal. Esto se utiliza para definir el aspecto de su indicador cuando inicia una sesión de shell.
PS2 – Declara indicadores secundarios para cuando un comando abarca varias líneas.

Configuración de comandos de entorno y de shell

Primero, como se explicó anteriormente, mantendremos los nombres de las variables en mayúsculas. A continuación, pasaremos a crear variables de shell. Finalmente, crearemos variables de entorno.

Creación de variables de shell

Comencemos con el habitual hola mundo. Introduzca lo siguiente en su terminal:

Se utilizan las comillas porque la variable tiene un espacio. Observe que usamos una comilla simple porque el signo de exclamación es un carácter especial y debe escaparse o ponerse entre comillas simples. Ahora, ha creado su primera variable de shell. Está disponible únicamente en la sesión de shell actual. Las variables de shell no están disponibles para los shells y procesos secundarios. Puede imprimirla en la terminal utilizando el comando set con grep:

print variable

O mostrar el valor usando echo, haciéndole referencia mediante el signo $ y el nombre de la variable:

echo variable

Si intenta imprimir usando printenv, no mostrará ninguna salida. Esto le ayuda a confirmar que no se trata de una variable de entorno:

printenv variable

Creación de variables de entorno

La variable de shell creada anteriormente se puede convertir en una variable de entorno utilizando el comando export. Primero, crea una variable de shell. Luego, para crear una variable de entorno, debe utilizar el comando export. Después de ejecutar este comando, la variable estará disponible para los shells y procesos secundarios:

Ahora, si realizas la prueba utilizando el comando printenv, deberías ver la variable y el valor:

printenv variable value

También puedes crear una variable de entorno en un solo paso utilizando la sintaxis:

Las variables de entorno solo se pasan a los shells hijos y no al padre. Esto ayuda a evitar que los procesos hijos afecten al entorno del programa que los llamó.

Degradar y desasignar variables

Si has estado siguiendo el tutorial hasta este momento, todavía tienes MY_FIRST_VAR definida como una variable de entorno. Puedes volver a cambiarla a una variable de shell escribiendo el comando echo con la opción –n:

Si realizas la prueba con printenv, no habrá ninguna salida. Sin embargo, el comando echo la mostrará porque todavía es una variable de shell:

echo vs prinenv command

Puedes desasignar tanto una variable de shell como una de entorno utilizando el comando unset. Y puedes confirmar que ya no existe utilizando echo. Como puedes ver, no muestra ninguna salida:

unset variable Environmental and Shell Variables

Configuración de variables de entorno al iniciar sesión

Muchos programas dependen de variables de entorno para su ejecución. Dado que no es eficiente configurar las variables cada vez que deseas ejecutar un programa, Linux proporciona una forma de definirlas y guardarlas en un archivo. De esta manera, se pueden configurar automáticamente al iniciar sesión. El shell lee diferentes archivos de configuración según cómo se inicie la sesión. Estos se analizan a continuación:

Tipos de sesiones de shell y sus diferencias

  • Sesión de shell de inicio de sesión: comienza autenticando al usuario. La sesión se establece cuando inicias sesión a través de SSH o una sesión de terminal.
  • Sesión de shell sin inicio de sesión: comienza cuando inicias un nuevo shell desde tu shell autenticado. Puedes iniciar un nuevo shell usando el comando bash. No se requieren detalles de autenticación.
  • Sesión de shell interactiva: una sesión de shell asociada a una sesión de terminal.
  • Sesión de shell no interactiva: una sesión de shell no asociada a una sesión de terminal; se ejecuta en segundo plano.

Una sesión se clasifica como de inicio de sesión o sin inicio de sesión, y como interactiva o no interactiva. Cuando inicias sesión y comienzas una sesión de shell a través de SSH, esa será una sesión de shell interactiva y de inicio de sesión. Cuando ejecutas un script en la terminal, generalmente se ejecuta en una sesión sin inicio de sesión y no interactiva. Una sesión de shell también puede ser una combinación de ambas. Entonces, ¿qué archivo de configuración se elige?

Una sesión de inicio de sesión lee primero los archivos de configuración del directorio /etc/profile. En segundo lugar, comprueba los archivos de configuración específicos del usuario en su directorio de inicio. Solo se lee el primer archivo encontrado entre ~/.bash_profile, ~/.bash_login y ~/.profile, y se ignoran todos los demás archivos. Una sesión sin inicio de sesión leerá primero de /etc/bash.bashrc, seguido de ~/.bashrc. Las sesiones no interactivas leen la variable de entorno llamada BASH_ENV para obtener el nombre del archivo que se utilizará para definir el nuevo entorno.

Implementación de variables de entorno

Cuando configures tus variables, ten siempre en cuenta en qué archivo las colocas según lo analizado anteriormente. Esto proporcionará flexibilidad al garantizar que ciertas variables solo estén disponibles en ciertas sesiones. No querrás que falte una variable crucial en una sesión.

En algunos casos, queremos que la variable exista tanto en sesiones de inicio de sesión como sin inicio de sesión. Afortunadamente, la mayoría de las distribuciones de Linux, por defecto, han configurado las opciones de inicio de sesión para leer las configuraciones de las sesiones sin inicio de sesión y ponerlas a disposición de tus procesos. Por lo tanto, simplemente puedes definir tus variables en los archivos de configuración de sesiones sin inicio de sesión. Por lo general, configuramos variables de entorno específicas del usuario y queremos que nuestros ajustes estén disponibles tanto en sesiones de shell de inicio de sesión como sin inicio de sesión. Por este motivo, utilizaremos el archivo ~/.bashrc. Utilizaremos nano para editar el archivo. Introduce lo siguiente en tu terminal para abrir el archivo:

En el archivo de configuración abierto, ya puedes ver varias variables. Puedes añadir variables de entorno de la misma manera que lo haces cuando usas la línea de comandos. Simplemente escribe el comando:

Puedes añadirlas en cualquier parte del archivo, en una nueva línea y no dentro de una función de bucle. Luego, guarda y cierra el archivo. Cualquier próxima sesión de shell que inicies leerá desde el archivo. Si deseas que la shell actual lea la configuración que acabas de añadir sin tener que reiniciarla, puedes usar el comando:

Debes añadir variables de entorno a nivel de sistema en cualquiera de los siguientes: /etc/profile, /etc/bash.bashrc o /etc/environment.

En resumen

¡Finalmente, ahora puedes configurar variables de shell y de entorno y disfrutar del gran poder que estas herramientas aportan a tu VPS! Tiene muchas ventajas, como automatizar la ejecución de algunos procesos, o la configuración de despliegue automático que requiere información de autenticación, pasar variables a procesos secundarios y más. Las variables de entorno te ayudan a ocultar datos confidenciales como la información de autenticación de los repositorios públicos, entre otros datos. Con esta base, puedes crear scripts complejos que puedes ejecutar automáticamente a través de la línea de comandos sin requerir la intervención constante del usuario.

¡Feliz computación!

author

Akshay Nagpal

Autor · CloudSigma

Preslav Dobrev es diseñador creativo en CloudSigma, centrado en una identidad empresarial coherente mediante el uso de canales de marketing tradicionales e innovadores. Es experto en fusionar la visión artística con el marketing estratégico para crear narrativas de marca impactantes.

Comentarios

Aún no hay comentarios. Sea el primero.