Cómo leer y configurar variables ambientales y de shell en Linux

Introducción

Índice
  1. Introducción
  • Cómo funcionan el medio ambiente y las variables ambientales
  • Variables ambientales y de shell de impresión
    1. Variables ambientales y de concha comunes
  • Configuración de variables de entorno y de shell
    1. Creación de variables de shell
    2. Creación de variables ambientales
  • Degradación y anulación de variables
  • Configuración de variables ambientales al iniciar sesión
    1. Diferencias entre sesiones de shell con inicio de sesión, sin inicio de sesión, interactivas y no interactivas
    2. Implementación de variables ambientales
  • Conclusión
  • Al interactuar con el servidor a través de una sesión de shell, el shell compila muchos datos para determinar su comportamiento y acceso a los recursos. Algunos de estos ajustes están incluidos en los parámetros de configuración y otros están determinados por la entrada del usuario.

    Una forma en que el shell realiza un seguimiento de todas estas configuraciones y detalles es a través de un área que mantiene llamada entorno . El entorno es un área que el shell crea cada vez que inicia una sesión que contiene variables que definen las propiedades del sistema.

    En esta guía, analizaremos cómo interactuar con el entorno y leer o configurar variables ambientales y de shell de forma interactiva y a través de archivos de configuración.

    Si desea seguir usando su sistema local o un servidor remoto, abra una terminal y ejecute los comandos de este tutorial allí.

    Cómo funcionan el medio ambiente y las variables ambientales

    Cada vez que se inicia una sesión de shell, se lleva a cabo un proceso para recopilar y compilar información que debería estar disponible para el proceso de shell y sus procesos secundarios. Obtiene los datos para estas configuraciones de una variedad de archivos y configuraciones diferentes en el sistema.

    El entorno proporciona un medio a través del cual el proceso de shell puede obtener o establecer configuraciones y, a su vez, pasarlas a sus procesos secundarios.

    El entorno se implementa como cadenas que representan pares clave-valor. Si se pasan varios valores, normalmente se separan con dos :puntos ( ). Cada par suele tener el siguiente aspecto:

    KEY=value1:value2:...

    Si el valor contiene muchos espacios en blanco, se utilizan comillas:

    KEY="value with spaces"

    Las claves de estos escenarios son las variables, que pueden ser de dos tipos: variables ambientales o variables de shell.

    Las variables ambientales son variables que se definen para el shell actual y que heredan los shells o procesos secundarios. Las variables ambientales se utilizan para pasar información a los procesos que se generan desde el shell.

    Las variables de shell son variables que se encuentran exclusivamente dentro del shell en el que se establecieron o definieron. Suelen utilizarse para realizar un seguimiento de datos efímeros, como el directorio de trabajo actual.

    Por convención, este tipo de variables suelen definirse con letras mayúsculas. Esto ayuda a los usuarios a distinguir las variables ambientales en otros contextos.

    Variables ambientales y de shell de impresión

    Cada sesión de shell realiza un seguimiento de sus propias variables de shell y de entorno. Podemos acceder a ellas de diferentes maneras.

    Podemos ver una lista de todas nuestras variables ambientales mediante los comandos envor printenv. En su estado predeterminado, deberían funcionar exactamente igual:

    1. printenv

    Es posible que su entorno de shell tenga más o menos variables configuradas, con valores diferentes a los de la siguiente salida:

    OutputSHELL=/bin/bashTERM=xtermUSER=demouserLS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca:...MAIL=/var/mail/demouserPATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/gamesPWD=/home/demouserLANG=en_US.UTF-8SHLVL=1HOME=/home/demouserLOGNAME=demouserLESSOPEN=| /usr/bin/lesspipe %sLESSCLOSE=/usr/bin/lesspipe %s %s_=/usr/bin/printenv

    Esto es bastante típico de la salida de ambos comandos printenvy env. La diferencia entre los dos comandos solo es evidente en su funcionalidad más específica. Por ejemplo, con printenv, puede solicitar los valores de variables individuales:

    1. printenv PATH
    Output/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

    Por otro lado, envle permite modificar el entorno en el que se ejecutan los programas pasando un conjunto de definiciones de variables en un comando como este:

    1. env VAR1="value" command_to_run command_options

    Dado que, como aprendimos anteriormente, los procesos secundarios generalmente heredan las variables ambientales del proceso principal, esto le brinda la oportunidad de anular valores o agregar variables adicionales para el secundario.

    Como puede ver en el resultado de nuestro printenvcomando, hay bastantes variables ambientales configuradas a través de nuestros archivos y procesos del sistema sin nuestra intervención.

    Estos muestran las variables ambientales, pero ¿cómo vemos las variables de shell?

    Para ello, se puede utilizar el setcomando. Si lo escribimos setsin ningún parámetro adicional, obtendremos una lista de todas las variables del shell, variables ambientales, variables locales y funciones del shell:

    1. set
    OutputBASH=/bin/bashBASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepathBASH_ALIASES=()BASH_ARGC=()BASH_ARGV=()BASH_CMDS=(). . .

    Por lo general, se trata de una lista enorme. Probablemente quieras incluirla en un programa de búsqueda para gestionar más fácilmente la cantidad de resultados:

    1. set | less

    La cantidad de información adicional que recibimos es un poco abrumadora. Probablemente no necesitemos conocer todas las funciones bash que están definidas, por ejemplo.

    Podemos limpiar la salida especificando que setdebe funcionar en modo POSIX, lo que no imprimirá las funciones del shell. Podemos ejecutar esto en un subshell para que no cambie nuestro entorno actual:

    1. (set -o posix; set)

    Aquí se enumerarán todas las variables ambientales y de shell que estén definidas.

    Podemos intentar comparar esta salida con la salida de los comandos envo printenvpara intentar obtener una lista solo de variables de shell, pero esto será imperfecto debido a las diferentes formas en que estos comandos generan información:

    1. comm -23 (set -o posix; set | sort) (env | sort)

    Es probable que esto aún incluya algunas variables ambientales, debido al hecho de que el setcomando genera valores entre comillas, mientras que los comandos printenvy envno citan los valores de las cadenas.

    Esto aún debería darle una buena idea de las variables ambientales y de shell que están configuradas en su sesión.

    Estas variables se utilizan para todo tipo de cosas. Ofrecen una forma alternativa de establecer valores persistentes para la sesión entre procesos, sin escribir cambios en un archivo.

    Variables ambientales y de concha comunes

    Algunas variables ambientales y de shell son muy útiles y se hace referencia a ellas con bastante frecuencia. A continuación, se muestran algunas variables ambientales comunes con las que te encontrarás:

    • SHELL:Esto describe el shell que interpretará cualquier comando que escriba. En la mayoría de los casos, será bash de manera predeterminada, pero se pueden configurar otros valores si prefiere otras opciones.
    • TERM: Esto especifica el tipo de terminal que se emulará al ejecutar el shell. Se pueden emular diferentes terminales de hardware para diferentes requisitos operativos. Sin embargo, por lo general no tendrás que preocuparte por esto.
    • USER:El usuario que ha iniciado sesión actualmente.
    • PWD:El directorio de trabajo actual.
    • OLDPWD: El directorio de trabajo anterior. El shell lo conserva para poder volver al directorio anterior ejecutando cd -.
    • LS_COLORS: Esto define códigos de color que se utilizan para agregar opcionalmente una salida en color al lscomando. Esto se utiliza para distinguir diferentes tipos de archivos y brindar más información al usuario de un vistazo.
    • MAIL:La ruta al buzón del usuario actual.
    • PATH:Una lista de directorios que el sistema comprobará al buscar comandos. Cuando un usuario escribe un comando, el sistema comprobará los directorios en este orden en busca del ejecutable.
    • LANG:La configuración actual de idioma y localización, incluida la codificación de caracteres.
    • HOME:El directorio de inicio del usuario actual.
    • _:El comando más reciente ejecutado anteriormente.

    Además de estas variables ambientales, algunas variables de shell que verás a menudo son:

    • BASHOPTS: La lista de opciones que se usaron cuando se ejecutó bash. Esto puede ser útil para averiguar si el entorno de shell funcionará de la manera deseada.
    • BASH_VERSION:La versión de bash que se está ejecutando, en formato legible para humanos.
    • BASH_VERSINFO:La versión de bash, en salida legible por máquina.
    • COLUMNS:El número de columnas de ancho que se utilizan para dibujar la salida en la pantalla.
    • DIRSTACK:La pila de directorios que están disponibles con los comandos pushdy popd.
    • 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 la memoria.
    • HOSTNAME:El nombre de host de la computadora en este momento.
    • IFS:Separador de campo interno para separar la entrada en la línea de comandos. De manera predeterminada, es un espacio.
    • PS1: La definición del símbolo del sistema principal. Se utiliza para definir cómo se ve el símbolo del sistema cuando se inicia una sesión de shell. Se PS2utiliza para declarar símbolos del sistema secundarios cuando un comando abarca varias líneas.
    • SHELLOPTS:Opciones de shell que se pueden configurar con la setopción.
    • UID:El UID del usuario actual.

    Configuración de variables de entorno y de shell

    Para comprender mejor la diferencia entre las variables de shell y las variables ambientales, y para presentar la sintaxis para configurar estas variables, haremos una pequeña demostración.

    Creación de variables de shell

    Comenzaremos definiendo una variable de shell dentro de nuestra sesión actual. Esto es fácil de lograr; solo necesitamos especificar un nombre y un valor. Nos ceñiremos a la convención de mantener todo en mayúsculas para el nombre de la variable y lo configuraremos como una cadena simple.

    1. TEST_VAR='Hello World!'

    Aquí, hemos utilizado comillas, ya que el valor de nuestra variable contiene un espacio. Además, hemos utilizado comillas simples, ya que el signo de exclamación es un carácter especial en el shell bash que normalmente se expande al historial bash si no se escapa o se coloca entre comillas simples.

    Ahora tenemos una variable de shell. Esta variable está disponible en nuestra sesión actual, pero no se transmitirá a los procesos secundarios.

    Podemos ver esto haciendo una búsqueda de nuestra nueva variable dentro de la setsalida:

    1. set | grep TEST_VAR
    OutputTEST_VAR='Hello World!'

    Podemos verificar que esta no es una variable ambiental intentando lo mismo con printenv:

    1. printenv | grep TEST_VAR

    No se debe devolver ninguna salida.

    Aprovechemos esta oportunidad para demostrar una forma de acceder al valor de cualquier shell o variable ambiental.

    1. echo $TEST_VAR
    OutputHello World!

    Como puede ver, haga referencia al valor de una variable anteponiéndole un $signo. El shell interpreta que esto significa que debe sustituir el valor de la variable cuando lo encuentre.

    Ahora tenemos una variable de shell. No se debe pasar a ningún proceso secundario. Podemos generar un nuevo shell bash desde el actual para demostrarlo:

    1. bash
    2. echo $TEST_VAR

    Si escribimos bashpara generar un shell secundario y luego intentamos acceder al contenido de la variable, no se devolverá nada. Esto es lo que esperábamos.

    Regresa a nuestro shell original escribiendo exit:

    1. exit

    Creación de variables ambientales

    Ahora, vamos a convertir nuestra variable de shell en una variable de entorno. Podemos hacerlo exportando la variable. El comando para hacerlo tiene el nombre apropiado:

    1. export TEST_VAR

    Esto convertirá nuestra variable en una variable ambiental. Podemos comprobarlo consultando nuevamente nuestra lista ambiental:

    1. printenv | grep TEST_VAR
    OutputTEST_VAR=Hello World!

    Esta vez, aparece nuestra variable. Probemos nuestro experimento con nuestro shell secundario nuevamente:

    1. bash
    2. echo $TEST_VAR
    OutputHello World!

    ¡Genial! Nuestro shell secundario ha recibido la variable establecida por su shell principal. Antes de salir de este shell secundario, intentemos exportar otra variable. Podemos establecer variables ambientales en un solo paso de la siguiente manera:

    1. export NEW_VAR="Testing export"

    Pruebe que se exporte como variable ambiental:

    1. printenv | grep NEW_VAR
    OutputNEW_VAR=Testing export

    Ahora, volvamos a nuestro shell original:

    1. exit

    Veamos si nuestra nueva variable está disponible:

    1. echo $NEW_VAR

    No se devuelve nada.

    Esto se debe a que las variables ambientales solo se pasan a los procesos secundarios. No existe una forma integrada de configurar las variables ambientales del shell principal. Esto es bueno en la mayoría de los casos y evita que los programas afecten el entorno operativo desde el que fueron llamados.

    La NEW_VARvariable se estableció como una variable de entorno en nuestro shell secundario. Esta variable estaría disponible para sí misma y para cualquiera de sus shells y procesos secundarios. Cuando salimos de nuevo a nuestro shell principal, ese entorno se destruyó.

    Degradación y anulación de variables

    Aún tenemos nuestra TEST_VARvariable definida como variable de entorno. Podemos volver a convertirla en una variable de shell escribiendo:

    1. export -n TEST_VAR

    Ya no es una variable ambiental:

    1. printenv | grep TEST_VAR

    Sin embargo, sigue siendo una variable de shell:

    1. set | grep TEST_VAR
    OutputTEST_VAR='Hello World!'

    Si queremos anular por completo una variable, ya sea del shell o del entorno, podemos hacerlo con el unsetcomando:

    1. unset TEST_VAR

    Podemos verificar que ya no está configurado:

    1. echo $TEST_VAR

    No se devuelve nada porque la variable no ha sido establecida.

    Configuración de variables ambientales al iniciar sesión

    Ya hemos mencionado que muchos programas utilizan variables de entorno para decidir los detalles específicos de cómo operar. No queremos tener que configurar variables importantes cada vez que iniciamos una nueva sesión de shell y ya hemos visto cuántas variables ya están configuradas al iniciar sesión, así que ¿cómo creamos y definimos variables automáticamente?

    En realidad, este es un problema más complejo de lo que parece inicialmente, debido a los numerosos archivos de configuración que el shell bash lee dependiendo de cómo se inicia.

    Diferencias entre sesiones de shell con inicio de sesión, sin inicio de sesión, interactivas y no interactivas

    El shell bash lee diferentes archivos de configuración dependiendo de cómo se inicia la sesión.

    Una distinción entre las diferentes sesiones es si el shell se genera como una sesión de inicio de sesión o sin inicio de sesión .

    Un shell de inicio de sesión es una sesión de shell que comienza con la autenticación del usuario. Si inicia sesión en una sesión de terminal o a través de SSH y se autentica, su sesión de shell se configurará como un shell de inicio de sesión.

    Si inicia una nueva sesión de shell desde su sesión autenticada, como hicimos al llamar al bashcomando desde la terminal, se inicia una sesión de shell sin inicio de sesión . No se le solicitaron sus detalles de autenticación cuando inició su shell secundario.

    Otra distinción que se puede hacer es si una sesión de shell es interactiva o no interactiva.

    Una sesión de shell interactiva es una sesión de shell que está conectada a una terminal. Una sesión de shell no interactiva es una que no está conectada a una sesión de terminal.

    De esta forma, cada sesión de shell se clasifica como iniciada o no iniciada y como interactiva o no interactiva.

    Una sesión normal que comienza con SSH suele ser un shell de inicio de sesión interactivo. Un script que se ejecuta desde la línea de comandos suele ejecutarse en un shell no interactivo y sin inicio de sesión. Una sesión de terminal puede ser cualquier combinación de estas dos propiedades.

    El hecho de que una sesión de shell se clasifique como un shell con inicio de sesión o sin inicio de sesión tiene implicaciones sobre qué archivos se leen para inicializar la sesión de shell.

    Una sesión iniciada como sesión de inicio de sesión leerá /etc/profileprimero los detalles de configuración del archivo. Luego buscará el primer archivo de configuración del shell de inicio de sesión en el directorio de inicio del usuario para obtener los detalles de configuración específicos del usuario.

    Lee el primer archivo que puede encontrar entre ~/.bash_profile, ~/.bash_login, y ~/.profiley no lee ningún otro archivo.

    Por el contrario, una sesión definida como un shell sin inicio de sesión leerá /etc/bash.bashrcy luego el archivo específico del usuario ~/.bashrcpara construir su entorno.

    Los shells no interactivos leen la variable ambiental llamada BASH_ENVy leen el archivo especificado para definir el nuevo entorno.

    Implementación de variables ambientales

    Como puedes ver, hay una variedad de archivos diferentes que normalmente necesitaríamos revisar para colocar nuestras configuraciones.

    Esto proporciona mucha flexibilidad que puede resultar útil en situaciones específicas en las que queremos ciertas configuraciones en un shell de inicio de sesión y otras configuraciones en un shell sin inicio de sesión. Sin embargo, la mayoría de las veces querremos las mismas configuraciones en ambas situaciones.

    Afortunadamente, la mayoría de las distribuciones de Linux configuran los archivos de configuración de inicio de sesión para que sean la fuente de los archivos de configuración de no inicio de sesión. Esto significa que puede definir las variables de entorno que desee en ambos archivos de configuración de no inicio de sesión. Luego, se leerán en ambos escenarios.

    Normalmente, configuraremos variables de entorno específicas del usuario y, por lo general, querremos que nuestras configuraciones estén disponibles tanto en los shells con inicio de sesión como en los que no lo estén. Esto significa que el lugar para definir estas variables es en el ~/.bashrcarchivo.

    Abra este archivo ahora:

    1. nano ~/.bashrc

    Probablemente, esto ya contenga una gran cantidad de datos. La mayoría de las definiciones que aparecen aquí son para configurar opciones de bash, que no están relacionadas con las variables ambientales. Puedes configurar las variables ambientales tal como lo harías desde la línea de comandos:

    1. export VARNAME=value

    Se pueden agregar nuevas variables de entorno en cualquier parte del ~/.bashrcarchivo, siempre que no se coloquen en medio de otro comando o bucle for. Luego podemos guardar y cerrar el archivo. La próxima vez que inicie una sesión de shell, se leerá la declaración de su variable de entorno y se pasará al entorno de shell. Puede forzar a su sesión actual a leer el archivo ahora escribiendo:

    1. source ~/.bashrc

    Si necesita establecer variables para todo el sistema, puede considerar agregarlas a /etc/profile, /etc/bash.bashrco /etc/environment.

    Conclusión

    Las variables ambientales y de shell siempre están presentes en las sesiones de shell y pueden resultar muy útiles. Son una forma interesante para que un proceso padre establezca detalles de configuración para sus procesos secundarios y son una forma de establecer opciones fuera de los archivos.

    Esto tiene muchas ventajas en situaciones específicas. Por ejemplo, algunos mecanismos de implementación dependen de variables ambientales para configurar la información de autenticación. Esto es útil porque no requiere mantenerlas en archivos que puedan ser vistos por terceros.

    Existen muchos otros escenarios más mundanos, pero más comunes, en los que necesitará leer o modificar el entorno de su sistema. Estas herramientas y técnicas deberían brindarle una buena base para realizar estos cambios y utilizarlos correctamente.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

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

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion