Paths(1)

Para cualquier usuario de una computadora, que no dependa de una interfaz gráfica, la palabra «path» le será conocida. El término debe ser mucho más familiar para alguien que programa o que tiene que hacer uso de un intérprete de comandos en un sistema de archivos con organización jerárquica.

Un «path» es la trayectoria (ruta, y de aquí el término en inglés) que se sigue a través de la jerarquía de contenedores (directorios, folders) para llegar a un punto (un objeto) en particular: un directorio o un archivo.

Para quienes trabajamos en la línea de comandos, el path representa también una referencia, una serie de rutas donde el intérprete de comandos buscará por algún comando externo, utilería, o programa. Usualmente todo este conocimiento se reduce a lo anterior y a la existencia de una variable que contiene una o varias de estas rutas, por ejemplo, PATH, MANPATH, LIBPATH, LDPATH, JAVA_HOME, PYTHONHOME, etcétera.

Sin embargo, salvo por el caso de tratarse de una necesidad específica, como puede ser el de la variable JAVA_HOME, donde la necesitamos a fin de que la máquina virtual de Java encuentre lo que requiere y sabemos expresamente que debemos ajustarla para tal efecto1, la mayoría nos conformamos con el valor que estas variables tengan y no reparamos en ellas hasta que el intérprete de comandos de nuestro shell no encuentra lo que solicitamos usar.

Sin embargo, hay dos razones de peso que conviene tener presente al respecto de las variables que contienen rutas para hacer uso de programas, módulos o librerías: desempeño y consistencia.

Entendemos que la idea de una variable (usualmente de nombre PATH) que contiene la o las rutas sobre las cuales buscará cuando se requiere de algo, es para minimizar el costo de localización del comando externo2. Así, suena lógico que las primeras rutas en nuestra variable sean aquellas donde más frecuentemente deberá buscarse y haya la mayor probabilidad de encontrar lo que buscamos. Las últimas deberán ser aquellas donde se encuentre comandos o utilidades poco o rara vez empleadas. Por ejemplo, el conjunto de rutas en la variable PATH, podría ser:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

en este orden parecerá apropiado que /usr/bin y /bin sean de los primeras rutas sobre las cuales buscar, pues son los directorios en los que vienen incluidos la mayoría de los comandos y utlidades de un sistema operativo tipo unix.

Los directorios «sbin» contienen aquellos programas o comandos que están destinados para propósitos administrativos y que no deberían ser tan frecuentemente usados. /usr/local/bin contiene programas o utilidades que se espera son agregados por el usuario. Finalmente /usr/X11/bin corresponde a la ruta de la interfaz gráfica del sistema de ventanas X3, muy común en los unix, y que no esperaría fuese a ser usado muy frecuentemente por quien usualmente trabaja desde un shell, pero que puede tener algunas utilerías útiles desde la linea de comando y, también, podría ser invocado por el usuario en algún momento.

Así que, en términos de rapidez de localización y ejecución (desempeño, perfomance), el razonamiento anterior parece adecuado para el orden en que se presentan estos directorios. Algunos intérpretes de comandos, ciertamente, suelen crear tablas en memoria para localizar lo que necesitan mediante una función hash. Por lo que la idea de que cada vez que se solicita un comando externo se busquen en estas rutas puede ya no ser del todo apropiado.

Sin embargo, entra en escena lo relacionado con la consistencia. Supongamos que el usuario instala una versión diferente al del intérprete de Python que usualmente se incluye en el sistema operativo. Algo muy común, de hecho, y por lo que suele recomendarse que no se actualice dicho intérprete, pues muchas veces la distribución y actualización de software incluye scripts elaborados en y para dicha versión y conviene garantizar su ejecución con dicha versión del intérprete para evitar problemas que lleven a corromper o dejar mal instalado al sistema operativo o software del computador que se llega a instalar o administrar con estos scripts. Usualmente el intérprete «incluido de fábrica» se localiza en /bin o /usr/bin. Como se indicó, las instalaciones de usuario se hacen en /usr/local/bin por lo que el intérprete de fábrica será ejecutado pese a haberse instalado otro debido al orden de búsqueda declarado en PATH. Si queremos que el nuevo interprete sea ejecutado en lugar del ya incluido deberemos mover la ruta /usr/local/bin antes de /usr/bin o /bin para lograr tal efecto. Pero, dado lo ya descrito, es fácil prever los problemas que esto trae.

Podemos hacer este arreglo en nuestro archivo de configuración o inicialización de nuestro shell (en el caso de BASH, idealmente .bash_profile, pero puede hacerse en otros). Sin embargo, si se trata de un equipo en el que se tienen varios usuarios o donde la administración de software (instalación, desinstalación) es frecuente, conviene conocer cómo es que el valor de PATH se establece antes de que se agregue la configuración del usuario.

En el caso de OS X y macOS, el valor de PATH se construye a lo largo de varios pasos (los archivos indicados pueden no existir, lo cual no es causa de error):

  1. Para versiones anteriores a OS X 10.7, a través de launchd, valores de inicialización de variables son almacenados en /etc/launchd.conf. A partir de 10.7 en ~/.MacOSX/environment.plist.
  2. Posteriormente, la utilería path_helper lee el contenido de /etc/paths y agrega la declaración de rutas (una por línea). Acto seguido hace lo mismo con lo que encuentre en /etc/paths.d  en los archivos que aquí se encuentren.
  3. Se leen los archivos de configuración del sistema, /etc/profile
  4. Dependiendo del shell, se leen los archivos de configuración de cada cuenta. En el caso de BASH ~/.bash_profile, ~/.bash_login, and ~/.profile, en ese orden.
  5. En el caso de BASH, además, el archivo ~/.bashrc es leído cuando un shell interactivo, que no es un shell de login, es iniciado. Aunque este archivo puede ser incluido para su ejecución en alguno de los archivos del paso previo.

Referencias

  1. «Installing the JDK Software and Setting JAVA_HOME«, Oracle, web. Consulted: 2018.12.20. URL: https://docs.oracle.com/cd/E19182-01/820-7851/inst_cli_jdk_javahome_t/.
  2. Shelley Powers, Jerry Peek, Tim O’Reilly, Mike Loukides et al., «UNIX Power Tools«, O’Reilly, third edition. October 2002, ISBN 0-596-00330-7. URL: https://docstore.mik.ua/orelly/unix3/upt/ch01_09.htm.
  3. «Sistema de ventanas X«, Wikipedia, web. Consultado: 2018.12.20. URL: https://es.wikipedia.org/wiki/Sistema_de_ventanas_X.
  4. Daniel Hepper, «Change order of PATH entries on Mac OS X«, blog. Posted: 2011.02.25; Consulted: 2018.12.20. URL: https://daniel.hepper.net/blog/2011/02/change-order-of-path-entries-on-mac-os-x/.
  5. «Use ‘/etc/paths’ or ‘/etc/paths.d’ to add items to the PATH in macOS Sierra?«, StackExchange, web. Published: 2017.02.04; Consulted: 2018.12.20. URL: https://unix.stackexchange.com/questions/342574/use-etc-paths-or-etc-paths-d-to-add-items-to-the-path-in-macos-sierra.

Siguiente

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.