Cómo agregar un directorio a tu $PATH en Linux

$PATH (ruta) es uno de los manipuladores silenciosos en segundo plano de tu computadora Linux. Afecta silenciosamente tu experiencia de usuario, pero no tiene nada de sombrío. Te explicaremos qué hace y cómo puedes ajustarlo.

¿Qué es $ PATH en Linux y cómo funciona?

Cuando escribes un comando en una ventana de la terminal y presionas Enter, inicia mucha actividad incluso antes de que se ejecute tu comando.

Bash es la shell predeterminada en la mayoría de las distribuciones de Linux. Interpreta la línea de texto que ingresaste e identifica los nombres de comandos entremezclados con los parámetros. Asimismo, las tuberías, las redirecciones y cualquier otra cosa que haya allí. Luego localiza los archivos binarios ejecutables para esos comandos y los inicia con los parámetros que proporcionaste.

El primer paso que da la shell para localizar el ejecutable es identificar si un binario está involucrado. Si el comando que utiliza está dentro de la shell (una “shell incorporada”) no se requiere ninguna búsqueda adicional.

Las shell incorporadas son las más fáciles de encontrar porque son parte integral de la shell. Es como tenerlas en un cinturón de herramientas: siempre están contigo.

Sin embargo, si necesitas una de tus otras herramientas, debes hurgar en el taller para encontrarla. ¿Está en tu caja de herramientas o en una percha de pared? Eso es lo que hace la variable de entorno $PATH. Contiene una lista de lugares que la shell busca y el orden en que se buscarán.

Si deseas ver si un comando es una shell integrada, un alias, una función o un binario independiente mv/work/unfile, puedes usar el comando type como se muestra a continuación:

Esto nos dice que clear es un archivo binario, y el primero que se encuentra en la ruta se encuentra en /usr/bin. Es posible que tengas más de una versión clear instalada en tu computadora, pero esta es la que la shell intentará usar.

Como era de esperar, cd es un shell incorporada.

Listando tu $PATH (ruta)

Es fácil ver qué hay en tu path. Simplemente escribe lo siguiente para usar el comando echo e imprimir el valor contenido en la variable $PATH:

El resultado es una lista de ubicaciones del sistema de archivos delimitados por dos puntos (:). La shell busca de izquierda a derecha a través de la ruta, verificando la ubicación de cada sistema de archivos en busca de un ejecutable coincidente para realizar tu comando.

Podemos abrirnos camino a través de la lista para ver las ubicaciones del sistema de archivos que se buscarán y el orden en que se buscarán:

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /usr/games
  • /usr/local/games
  • /snap/bin

Algo que puede no ser inmediatamente obvio es que la búsqueda no comienza en el directorio de trabajo actual. Más bien, se abre paso a través de los directorios listados, y solo los directorios listados.

Si el directorio de trabajo actual no está en tu ruta, no se buscará. Además, si tienes comandos almacenados en directorios que no están en la ruta, la shell no los encontrará.

Demostración

Para demostrar esto, creamos un pequeño programa llamado rf. Cuando se ejecuta, rf imprime el nombre del directorio desde el que se inició en la ventana de la terminal. Estará ubicado en /usr/local/bin. También tenemos una versión más nueva en el directorio /dave/work.

Escribimos el siguiente comando which para mostrarnos qué versión de nuestro programa encontrará y usará la shell:

La shell informa que la versión que encontró es la del directorio que está en la ruta.

Escribimos lo siguiente para activarlo:

La versión 1.0 de rf ejecuta y confirma que nuestras expectativas eran correctas. La versión encontrada y ejecutada se encuentra en /usr/local/bin.

Para ejecutar cualquier otra versión de rf en esta computadora, tendremos que usar la ruta al ejecutable en la línea de comandos, como se muestra a continuación:

Ahora que le hemos dicho a la shell dónde encontrar la versión de rf que queremos ejecutar, utiliza la versión 1.1. Si preferimos esta versión, podemos copiarla en el directorio /usr/local/bin y sobrescribir la anterior.

Digamos que estamos desarrollando una nueva versión de rf. Tendremos que ejecutarlo con frecuencia a medida que lo desarrollamos y probamos, pero no copiaremos una compilación de desarrollo inédita en el entorno en vivo.

O tal vez hayamos descargado una nueva versión de rf y queramos hacer algunas pruebas de verificación antes de ponerla a disposición del público.

Si agregamos nuestro directorio de trabajo a la ruta, hacemos que la shell encuentre nuestra versión. Y este cambio solo nos afectará; otros seguirán utilizando la versión de rf en /usr/local/bin.

Agregar un directorio a tu $PATH

Puedes usar el comando export para agregar un directorio a $PATH. El directorio se incluye en la lista de ubicaciones del sistema de archivos que busca la shell. Cuando la shell encuentra un ejecutable coincidente, deja de buscar, por lo que debe asegurarse de buscar primero en tu directorio, antes /usr/local/bin.

Esto es fácil de hacer. Para nuestro ejemplo, escribimos lo siguiente para agregar nuestro directorio al inicio de la ruta. Por lo tanto, es la primera ubicación buscada:

Este comando establece que $PATH debe ser igual al directorio que estamos agregando, /home/dave/work, y luego a la ruta actual completa.

La primera PATH no tiene signo de dólar ($). Establecemos el valor para PATH. La $PATH final tiene un signo de dólar porque estamos haciendo referencia a los contenidos almacenados en la variable PATH. Además, ten en cuenta los dos puntos (:) entre el nuevo directorio y el nombre de la variable $PATH.

Veamos cómo se ve la ruta ahora:

Nuestro directorio /home/dave/work se agregó al inicio de la ruta. Los dos puntos que proporcionamos lo separa del resto de la ruta.

Escribimos lo siguiente para verificar que nuestra versión de rf sea ​​la primera encontrada:

Podemos ver que se está ejecutando rf, como se muestra a continuación:

La shell encuentra la versión 1.1 y la ejecuta desde /home/dave/work.

Para agregar nuestro directorio al final de la ruta, simplemente lo movemos al final del comando, así:

Hacer permanentes los cambios 

Como dijo Beth Brooke-Marciniak: “El éxito está bien, pero el éxito es fugaz”. En el momento en que cierras la ventana de la terminal, los cambios que hayas realizado en la $PATH desaparecen. Para que sean permanentes, debes colocar tu comando export en un archivo de configuración.

Cuando colocas el comando export en tu archivo .bashrc, debes establecer la ruta cada vez que abres una ventana de la terminal. A diferencia de las SSHsesiones, para las cuales debes iniciar sesión, se denominan sesiones “interactivas”.

En el pasado, ponías el comando export en tu archivo .profile para establecer la ruta para iniciar sesión en las sesiones de la terminal.

Sin embargo, descubrimos que si colocamos el comando export en los archivos .bashrc o  .profile, establece correctamente la ruta para las sesiones de terminal interactivas y de inicio de sesión. Tu experiencia puede ser diferente. Para manejar todas las eventualidades, te mostraremos cómo hacerlo en ambos archivos.

Debes usar el siguiente comando en tu directorio /home para editar el archivo .bashrc:

El editor gedit se abre con el archivo .bashrc cargado.

Desplázate hasta la parte inferior del archivo y luego agrega el siguiente comando export que usamos anteriormente:

Debes guardar el archivo. A continuación, cierra y vuelve a abrir la ventana de la terminal o usa el comando dot para leer el archivo .bashrc, de la siguiente manera:

Luego, escribe el siguiente comando echo para verificar la ruta:

Esto agrega el directorio /home/dave/work al inicio de la ruta.

El proceso para agregar el comando al archivo .profile es el mismo. Escribe el siguiente comando:

El editor gedit se inicia con el archivo .profile cargado.

Debes agregar el comando export al final del archivo y guárdalo. Cerrar y abrir una nueva ventana de la terminal es insuficiente para forzar la lectura del archivo .profile. Para que la nueva configuración surta efecto, debes cerrar sesión y volver a iniciarla o utilizar el comando dot como se muestra a continuación:

Establecer la ruta para todos

Para establecer la ruta para todos los que usan el sistema, puedes editar el archivo /etc/profile.

Deberás usar sudo de la siguiente manera:

Cuando se inicie el editor gedit, debes agregar el comando export al final del archivo.

Tienes que guardar y cerrar el archivo. Los cambios tendrán efecto para otros la próxima vez que inicien sesión.

Una nota importante sobre seguridad

Asegúrate de no agregar accidentalmente dos puntos “:” a la ruta, como se muestra a continuación:

Si lo haces, primero buscará en el directorio actual, lo que presenta un riesgo de seguridad. Supongamos que descargaste un archivo y lo descomprimiste en un directorio. Miras los archivos y ves otro archivo comprimido. Ejecutas unzip una vez más para extraer ese archivo.

Si el primer archivo contenía un archivo ejecutable llamado unzip que era un ejecutable malicioso, accidentalmente activarías ese en lugar del ejecutable unzip real. Esto sucedería porque la shell buscaría primero en el directorio actual.

Por lo tanto, siempre debes tener cuidado al escribir tus comandos export. Debes usar echo $PATH para revisarlos y asegúrate de que sean como tú quieres que sean.