VARIABLES DE ENTORNO

Las variables de entorno se utilizan para almacenar algunos valores que pueden ser utilizados por los scripts desde el shell. No estás limitado a las variables de entorno del shell, puedes crear las tuyas propias.

El shell de bash tiene dos tipos de variables de entorno:

  • Variables globales
  • Variables locales

La variable local es visible solo en el shell donde definió, mientras que la variable global es visible para cualquier proceso en ejecución o que se ejecute desde el shell.



Variables globales

El sistema Linux establece algunas variables de entorno globales cuando inicias sesión en tu sistema y siempre son en LETRAS MAYÚSCULAS para diferenciarlas de las variables de entorno definidas por el usuario.

Si queremos ver las variables de entorno que estamos usando y que estan cargadas en nuestra sesión, escribe el comando printenv o env:

~$ printenv

...
USER=JGL
CONDA_EXE=/anaconda2/bin/conda
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.JeacBiHuQB/Listeners
_CE_CONDA=
LSCOLORS=ExFxBxDxCxegedabagacad
PATH=/Users/JGL 1/edirect:/anaconda2/bin:/anaconda2/condabin:/Users/JGL 1/.rbenv/shims:/usr/local/kSNP3:/Users/JGL 1/Documents/SPAdes-3.13.0-Darwin/bin:/Applications/sratoolkit.2.9.2/bin:/Users/JGL 1/mview-1.64/bin:/Users/JGL 1/Documents/bioinformaticsbinaries:/Users/JGL 1/Documents/HTSeq-0.8.0/scripts:/Library/Python/2.7/site-packages/ete3/tools:/Users/JGL 1/anaconda_ete/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/Users/JGL 1/Documents/ncbi-blast-2.6.0+/bin
CONDA_PREFIX=/anaconda2
PWD=/Users/JGL 1/Dropbox/programacion_bioinformatica/tema_4_BASH_scripting/if_loops
XPC_FLAGS=0x0
PS1=(base) \[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]$ 
RBENV_SHELL=bash
...


Hay muchas variables de entorno globales, para imprimir solo una de ellas, escribe el comando echo seguido de $NombreDeVariable. Ej: para imprimir la variable HOME escribe echo $HOME

~$ echo $HOME
/Users/JGL 1

Podemos configurar las variables de entorno modificando los archivos de configuración de la shell. En nuestro caso la shell por defecto que usamos es bash, por lo tanto el fichero de configuración que debemos usar es: $HOME/.bashrc


en caso de usar MAC: $HOME/.bash_profile


Dentro de nuestro .bashrc podemos modificar las variables que se inicializaran en nuestra shell con nuestro usuarios ademas de almacenar alias, o cambiar la configuración de de aspecto de la shell entre otros.



Variables locales

En realidad, el sistema Linux también define algunas variables de entorno locales estándar de forma predeterminada.

Para ver las variables globales y locales del shell que está ejecutando y las que están disponible para ese shell, escribe el comando set.

Para declarar una variable en Shell escribe el nombreDeLaVariable que desees, seguido de un signo igual y el valor SIN espacios:

~$ myName='Joaquin'
~$ echo $myName
~$ Joaquin

Una vez que hayas establecido tu variable local, será visible en el alcance del shell actualmente en ejecución, esto significa que, si inicias otra ventana del shell, la variable no estará disponible en esa nueva ventana.



Declarar variables globales

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

~$ myvar='soy una variable global'
~$ echo $myvar
~$ export myvar

Ahora, mientras tengamos abierta la terminal donde se exportó la variable myvar, cualquier nueva ventana de terminal que abra tendrá acceso a dicha variable global. Sin embargo, si cierro todas las ventanas del terminal y abro una nueva Shell, dicha variable habrá desaparecido, pruébalo!!.



variable global persistente

¿Como podemos entonces generar variables que persistan en el sistema?

Simplemente tendremos que cambiar la sintaxis a la hora de exportar la variable:

~$ export my_var='soy una variable global'
~$ echo $myvar 

eliminar variable global

Si queremos eliminar una variable global solo tendremos que utilizar el comando unset:

~$ unset myvar
~$ echo $myvar


Variables de entorno predeterminadas

Como hemos visto anteriormente, el sistema define algunas variables de forma predeterminada para nosotros, una de esas es la variable PATH, que contiene algunas rutas de ejecución importantes. Estas rutas son las predeterminadas que utiliza el shell para buscar un comando cuando se escribe en el terminal.

echémosle un vistazo:

$ echo $PATH
/Users/JGL 1/edirect:/anaconda2/bin:/anaconda2/condabin:/Users/JGL 1/.rbenv/shims:/usr/local/kSNP3:/Users/JGL 1/Documents/SPAdes-3.13.0-Darwin/bin:/Applications/sratoolkit.2.9.2/bin:/Users/JGL 1/mview-1.64/bin:/Users/JGL 1/Documents/bioinformaticsbinaries:/Users/JGL 1/Documents/HTSeq-0.8.0/scripts:/Library/Python/2.7/site-packages/ete3/tools:/Users/JGL 1/anaconda_ete/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/Users/JGL 1/Documents/ncbi-blast-2.6.0+/bin


Asi es un poco engorroso, que tal si aplicamos lo aprendido en los bucles For

$ for line in $(echo $PATH); do echo "$line" ;done
:/Users/JGL1/edirect
:/anaconda2/bin
:/anaconda2/condabin
:/Users/JGL1/.rbenv/shim
:/usr/local/kSNP3
:/Users/JGL1/mview-1.64/bin
:/Users/JGL1/Documents/bioinformaticsbinaries
:/Users/JGL1/Documents/HTSeq-0.8.0/scripts
:/Library/Python/2.7/site-packages/ete3/tools
:/Users/JGL1/anaconda_ete/bin
:/usr/local/bin
:/usr/bin
:/bin
:/usr/sbin
:/sbin
:/opt/X11/bin
:/usr/local/git/bin
:/Users/JGL1/Documents/ncbi-blast-2.6.0+/bin

Como podeis observar hay un total de 8 entradas con los path de programas que puedo ejecutar directamente en la shell, como blast, kSNP3 o HTSeq.



Modificando la variable de entorno PATH

Si agregas una ruta de carpeta a la variable PATH, el shell buscará en esa carpeta cualquier ejecutable que se ejecute cuando escribas cualquier comando.

Simplemente agrega la variable de ruta seguida de dos puntos y el nuevo directorio como se muestra a continuación:

PATH=$PATH:/path/to/directory

aqui un ejemplo

~$ PATH=$PATH:/Users
~$ for line in $(echo $PATH); do echo "$line" ;done
:/Users
:/Users/JGL1/edirect
:/anaconda2/bin
:/anaconda2/condabin
:/Users/JGL1/.rbenv/shim
:/usr/local/kSNP3
:/Users/JGL1/mview-1.64/bin
:/Users/JGL1/Documents/bioinformaticsbinaries
:/Users/JGL1/Documents/HTSeq-0.8.0/scripts
:/Library/Python/2.7/site-packages/ete3/tools
...

si queremos que la variable sea persistente tenemos que editar el archivo .bashrc o .bash_profile en mac y añadirlo de la siguiente manera:

export PATH=$PATH:/path/to/directory


Almacenando comandos en una variable

Para almacenar en una variable la salida (stdout) de un comando en la Shell, podemos utilizar la sustitución de comandos. Para ello existen dos métodos:

Encapsular el comando dentro de la estructura $(comando) :

~$ mycurrentdir=$(pwd)
~$ echo $mycurrentdir
/Users/JGL

Encapsular con el carácter comilla simple invertida (`):

~$ mycurrentdir=`pwd`
~$ echo $mycurrentdir
/Users/JGL


Operaciones aritméticas

Tambien podemos realizar operaciones aritméticas y almacenarlas en variable. Veamos como se hace. Imaginemos que queremos obtener la suma de 1+1 y alamcenarlo en la variable suma.

~$ suma=1+1
~$ echo $suma
1+1

umm, parece que no ha funcionado. Probemos otra opción:

~$ suma=(1+1)
~$ echo $suma
1+1

¡vaya!, tampoco funciona

Parece que en vez de la suma estamos obteniendo lo que almacenamos en la variable suma. Eso es porque bash está interpretando que la variable suma contiene un string. Tenemos que indicarle que la variable suma contiene una operación aritmética y eso lo hacemos con la siguiente sintaxis:

~$ suma=$((1+1))
~$ echo $suma
2