¿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.