domingo, 25 de enero de 2009

Cómo modificar la variable PATH

Fuente:Bash Reference Manual

Para comenzar es necesario tener una idea general de lo que es el Bash. Me voy a limitar a copiar la definición de Wikipedia, sabiendo que existe infinita información disponible en Internet para quienes deseen informarse mejor:

bash es un shell de Unix (intérprete de órdenes de Unix) escrito para el proyecto GNU. Su nombre es un acrónimo de bourne-again shell (otro shell bourne) — haciendo un juego de palabras (born-again significa renacimiento) sobre el Bourne shell (sh), que fue uno de los primeros intérpretes importantes de Unix.

Ahora bien, cuando introducimos un comando en BASH el sistema busca un archivo con ese nombre en todos los directorios contenidos en la variable PATH. En caso de no encontrarlo se retorna un mensaje de error especificando que el comando no ha sido encontrado. Para saber los directorios contenidos en PATH debes escribir en la consola:
echo $PATH

Te retornará algo como esto:
/usr/local/bin:/usr/bin:/bin:/usr/games/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/lib/qt/bin

Cada ruta de directorio aparece separada por dos puntos (:). En caso de que desees agregar directorios a tu PATH puedes hacerlo de dos formas: La primera los hace válidos por el tiempo que dura tu sesión, la segunda los hace permanentes.

Para el primer caso basta escribir en el terminal:
PATH="$PATH:<ruta nueva1>:<ruta nueva2>:...<ruta nuevaN>"

Supongamos que tenemos un usuario que desea agregar dos carpetas a su PATH, ambas contenidas en ~/: la carpeta Scripts y la carpeta compilados. Tendría que escribir en el terminal:
PATH="$PATH:/home/nombreusuario/Scripts:/home/nombreusuario/compilados"

De esa manera ambos directorios se agregan a su variable PATH. Sin embargo, estos cambios no son permanentes y la próxima vez que el usuario acceda a su cuenta todas las modificaciones se habrán perdido.
Para que los cambios sean permanentes es necesario editar un par de archivos: ~/.bash_profile y ~/.bashsrc

~/.bash_profile
Editar este archivo permite especificar una serie de comandos que se ejecutarán en cuanto el usuario acceda a su cuenta. En caso de que el archivo no exista puedes crearlo. Un ejemplo de lo que contiene este archivo es el siguiente:

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

BASH_ENV=$HOME/.bashrc
USERNAME=""
PATH=$PATH:/usr/local/pgsql/bin:/usr/local/sbin:/usr/sbin:/sbin
MANPATH=$MANPATH:/usr/local/pgsql/man
PGLIB=/usr/local/pgsql/lib
PGDATA=/usr/local/pgsql/data

export USERNAME BASH_ENV PATH MANPATH PGLIB PGDATA

Los directorios que aparecen asignados a la variable PATH se sumarán a los directorios básicos que asigna el sistema a todos los usuarios. El archivo .bash_profile se carga cada vez que el usuario realiza un login a su cuenta. Para decirlo de un modo más específico, cada vez que Bash es invocado mediante un login shell interactivo (cuando te logeas con tu password)o mediante un shell no interactivo con la opción --login, primero lee y ejecuta los comandos desde el archivo /etc/profile, en caso de que este archivo exista. Luego de leer este archivo busca los archivos ~/.bash_profile, ~/.bash_login y ~/.profile, en ese orden. La idea es que se ejecutarán los comandos del primero de los archivos que sea encontrado y sea legible. Una vez encontrado este archivo no seguirá buscando los demás, por esa razón es que es preferible asegurarse de trabajar con el primer archivo de la lista.

Nota: ~/ se usa para indicar tu directorio home. Si tu usuario es carlos, por ejemplo, ~/ corresponde a /home/carlos/

Sin embargo, si accedemos a un terminal desde un entorno de escritorio como Gnome, KDE o Xfce, nos encontraremos con que el archivo .bash_profile no es leído. En ese caso, además, debemos modificar el archivo .bashrc


~/.bashrc
Cuando se inicia un shell interactivo que no es un login shell, es decir que no requiere que ingreses a tu cuenta con tu clave y nombre de usuario, Bash lee y ejecuta comandos desde ~/.bashrc, si es que ese archivo existe. Un ejemplo del contenido de este archivo sería el siguiente:

alias ll="ls -al --color"
alias nautilus="nautilus --no-desktop"
alias aterm="aterm -fg white -tr"
export PS1='\u[\W]\$ '
export PAGER="most"
export PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin

Esta última linea contiene los directorios que se sumarán a los que cada usuario tiene por defecto.
De esta manera, editando ambos archivos es posible modificar tu variable PATH.

Por supuesto, existe más de un método de hacer todo lo anterior, es cosa de descubrir la forma que prefieras. Se puede, también, modificar los archivos /etc/profile y /etc/bashrc que corresponden a los archivos ~/.bash_profile y ~/.bashrc, pero que afectan a todos los usuarios. Evidentemente que para modificarlos necesitarás permisos de superusuario.

4 comentarios:

marcomvh dijo...

gracias por el dato. tenia problemas ejecutando un script en php (cake bake de cakephp) y no tenia las variables de entorno definidas. =) (ubuntu 11.04)

Emanuel dijo...

gracias por el dato, tenía problemas ejecutando un script en rvm (rvm era definida como una función en la shell, pero cuando abría de nuevo la terminal, ya no tomaba rvm como una función). El problema era que faltaba definirla en el archivo .bashrc ya que solo lo había hecho en el archivo .bash_profile. =) (ubuntu 11.04)

Unknown dijo...

Muchas gracias! yo no podia compilar correctamente mis fuentes de fortran y era porque no tenia la carpeta donde estaba el compilador en el path!
mil gracias

Norberto Winkler dijo...

Gracias por compartir este post con nosotros, muy bien explicado, entendi todo, voy a linkear tu entrada a mi reciente block para tenerlo a mano, gracias otra vez.