lunes, 1 de junio de 2009

el "PATH"

Cuando queremos que el sistema ejecute un comando, casi nunca tenemos que darle la ruta de acceso al comando (o path). Por ejemplo, sabemos que el comando $ ls esta en el directorio /bin (lo pueden comprobar con $ wich -a ls ), tampoco tenemos que ingresar el comando como $ /bin/ls para que la computadora liste el directorio en el que estamos.

La variable de entorno PATH se ocupa de esto. Esta variable lista aquellos directorios en el systema donde los archivos ejecutables pueden ser encontrados, y esto le ahorra al usuario el trabajo de memorizar y tipear la ubicación de los comandos. Naturalmente, el path contiene algunos directorio con el nombre bin en sus nombres. El comando $ echo es usado para mostrar el contenido ("$") de la variable PATH:

rogier:> echo $PATH
/opt/local/bin:/usr/X11R6/bin:/usr/bin:/usr/sbin/:/bin

En este ejemplo, los directorios /opt/local/bin, /usr/X11R6/bin, /usr/bin, /usr/sbin y /bin son los los directorios donde el sistema busca, secuencialmente, cuando se le pide que
ejecute un comando. Al instante en que encuentra el comando, el sistema deja de buscar, aún si no ha buscado en todos los directorios. Esto, pude llevar a alguna situacion extraña. En el primer ejemplo arriba, el usuario sabe que hay un programa llamado sndsms para enviar mensajes SMS. Otro usuario pude utilizar este programa pero éste no. La diferencia se encuentra en la configuración del PATH:

[jenny@blob jenny]$ sendsms
bash: sendsms: command not found
[jenny@blob jenny]$ echo $PATH
/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/home/jenny/bin
[jenny@blob jenny]$ su - tony
Password:
tony:~>which sendsms
sendsms is /usr/local/bin/sendsms
tony:~>echo $PATH
/home/tony/bin.Linux:/home/tony/bin:/usr/local/bin:/usr/local/sbin:\
/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin

Notar el uso de su (por switch user), que permite correr una consola en el entorno de otro usuario, siempre y cuando se conozca la clave de dicho usuario.

La barra invertida indica la continuación de una linea en el siguiente renglon.


En el siguiente ejemplo, un usuario quiere usar el comando wc (word count) para chequear el numero de lineas en un archivo, pero nada sucede y el usuario debe cancelar el proceso con [Ctrl]+[c]:

jumper:~> wc -l test
(Ctrl-C)
jumper:~> which wc
wc is hashed (/home/jumper/bin/wc)
jumper:~> echo $PATH
/home/jumper/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin

El uso del comando $ wich nos muestra que el usuario tiene un directorio bin en su home, conteniendo un programa tambien llamado wc. Como este programa esta en su directorio home es encontrado primero cuando el sistema busca a través del path, entonces este "home-made" programa es ejecutado en lugar del comando wc original. Existen varias maneras de solucionar este
problema (acorde a la filosofia UNIX): Una opcion sera renombral el programa
wc del usuario, o el usuario podria darle el path complete al solicitar la ejecución del programa wc, que puede ser encontrado utilizando $ which -a wc.

No hay comentarios: