Variables de Entorno en Linux

¿Para qué necesitamos las variables de entorno?

Las variables de entorno las necesitamos para guardar algunos valores que pueden ser utilizados cuando trabajamos, modificando valores que por defecto tiene el sistema operativo, es como decorar nuestro lugar de trabajo, ademas de esto tambien las usamos en scripts.

El shell tiene sus propias variables pero nosotros podemos crear todas las que necesitemos.

En el caso de que usemos bash como interprete de comandos vamos a encontrar que tenemos  dos tipos de variables de entorno:

  • Variables globales.
  • Variables locales.

Una variable global es visible para cualquier proceso en ejecución o que se ejecute desde el shell, en cambio una variable local es aquella que podemos encontrar y ver solo desde  shell donde definió.

Variables globales

Siempre que iniciamos el sistema y nos logueamos es el sistema  Linux el establece algunas variables de entorno globales, estas varialbles se escriben  LETRAS MAYÚSCULAS para diferenciarlas de los comandos.

Para ver estas variables globales, escribe el comando printenv:

 

$ printenv 
SHELL=/bin/bash
LANGUAGE=es_AR:es
PWD=/home/fabian
LOGNAME=fabian
XDG_SESSION_TYPE=tty
HOME=/home/fabian
LANG=es_AR.UTF-8
LS_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:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
SSH_CONNECTION=192.168.0.222 57076 192.168.0.113 22
XDG_SESSION_CLASS=user
TERM=xterm-256color
USER=fabian
SHLVL=1
XDG_SESSION_ID=1
XDG_RUNTIME_DIR=/run/user/1000
SSH_CLIENT=192.168.0.222 57076 22
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
MAIL=/var/mail/fabian
SSH_TTY=/dev/pts/0
_=/usr/bin/printenv

Como vemos en el ejemplo, tenemos muchas variables de entorno globales: Si queremos imprimir solo una de ellas, podemos escribir el comando echo seguido de $NOMBRE_DE_LA_VARIABLE (recordemos que siempre las variables de entorno se escriben con mayúsculas)

Ej: para imprimir la variable HOME escribimos el comando:

$ echo $HOME
/home/fabian

 

Variables locales

Nuestro sistema operativo define algunas variables de entorno locales estándar de forma predeterminada estas variables estan guardadas en el archivo /etc/profile.

¿Cómo definimos variables locales?

Para definir nuestras  propias variables de entorno escribimos en el interprete de comandos: el nombre de la variable que vamos a crear luego el signo igual y luego el valor que va a tomar esa variable (todo escrito sin espacios), vamos a un ejemplo.

~$ MI_VARIABLE=carreralinux

Si queremos el valor de la variable, use el comando echo, veamos el ejemplo completo.

~$ MI_VARIABLE=carreralinux
~$ echo $MI_VARIABLE
carreralinux

Tenemos que tener en cuenta que esta variable «vive» mientras estemos conectados a este interprete de comandos cuando cerramos la sesión esta variable, es eliminada.

¿Cómo hacemos para que estas variables sean persistentes?

Para declarar una variable de entorno global, debes declarar una variable de entorno local y luego utilizar el comando export de la siguiente manera:

~$ MI_VARIABLE='Soy una variable exportada me transformare en variable global'
~$ echo $MI_VARIABLE
Soy una variable exportada me transformare en variable global
~$ export $MI_VARIABLE

Ahora si salimos del shell y abrimos otra sesión podemos observar que la variable sigue viva esto quiere decir que la variable se transformo en global.
Lo que hacemos si queremos que esta variable este disponible siempre que el usuario acceda a una terminal es modificar el archivo .bashrc que se encuentra en nuestro home y luego ejecutar el comnado source.

Veamos el ejemplo completo:

~$ echo MI_VARIABLE=Hola >> .bashrc 
~$ source .bashrc
~$ echo $MI_VARIABLE
Hola

Ahora solo nos queda abrir una nueva terminal y ejecutar el comando echo:

~$ echo $MI_VARIABLE
Hola

Vamos a plantear un ejercicio:

Como hacemos para agregar a la varible de entorno PATH la siguiente ruta: /home/$USER/bin.
Aseguremonos haber creado el directorio bin dento del home del usuario, antes de modificar la variable de entorno PATH.

¿Podemos crear variables que tengan mas de un valor como un array?

Podemos crear variables de tipo array para esto tenemos que crear a la variable de la siguiente manera:

~$ ARREGLO=(uno dos tres)

Ahora vamos a imprimir cada una de las variables de acuerdo al lugar que ocupa en el arreglo.

~$ echo ${ARREGLO[0]}
uno
~$ echo ${ARREGLO[1]}
dos
~$ echo ${ARREGLO[2]}
tres

 

¿Dónde guarda el sistema todas las variables de entorno y como las recorre cada vez que se inicia?

Tenemos que tener en cuenta que un interprete de comandos iniciar un shell de bash de las siguientes maneras:

  • Iniciar una sesión
  • El shell no interactivo.
  • El shell no interactivo

¿Que archivos lee el sistema cuando iniciamos una sesión?

Cuando iniciamos una sesion el sistema recorre los siguientes archivos de configuración:

/etc/profile
$HOME/.bash_login
$HOME/.bash_profile
$HOME/.profile
$HOME/.bashrc

El archivo /etc/profile el sistema lo recorre  en cada inicio de sesión, en cambio  los otros 3 archivos se ejecutan para cada usuario específico, podemos llamarlos variables de entorno específicas del usuario.

¿ Qué es un Shell interactivo?

Cuando tenemos que ingresar en el recuperación, se establece el shell interactivo, esto ocurre por ejemplo cuando tenemos algun error en un disco y el sistema nos pide que ingresemos la clave de root para arreglarlo.

Si inicias un shell interactivo, el sistema no buscará /etc/profile sino que buscará .bashrc en tu directorio HOME.

¿Qué es Shell no interactivo?

Este shell se ejecuta por el propio sistema para ejecutar un script de shell.

Los usuarios podemos personalizar los archivos mencionados anteriormente para incluir variables de entorno, para hacer esto tenemos que editar cualquiera de los archivos descriptos anteriormente y luego ejecutar el comando source para que sean leidos.