Una computadora portátil Linux con líneas de texto verde en una ventana de terminal.

$PATHes uno de los manipuladores silenciosos en el fondo de su computadora Linux. Afecta silenciosamente su experiencia de usuario, pero no tiene nada de sospechoso. Le explicaremos qué hace y cómo puede ajustarlo.

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

Cuando escribe un comando en una ventana de terminal y presiona Enter, inicia una gran cantidad de actividad incluso antes de que se ejecute el comando.

Bash es el shell predeterminado en la mayoría de las distribuciones de Linux. Interpreta la línea de texto que ingresó e identifica los nombres de los comandos entremezclados con los parámetros, las tuberías, las redirecciones y cualquier otra cosa que esté allí. Luego, ubica los binarios ejecutables para esos comandos y los lanza con los parámetros que proporcionó.

El primer paso que toma el shell para localizar el ejecutable es identificar si un binario está involucrado. Si el comando que utiliza está dentro del propio shell (un "shell incorporado" ), no es necesario realizar más búsquedas.

Los elementos integrados de la carcasa son los más fáciles de encontrar porque son parte integral de la carcasa. Es como tenerlos en un cinturón de herramientas: siempre están contigo.

Sin embargo, si necesita alguna de sus otras herramientas, tendrá que buscar en el taller para encontrarla. ¿Está en su mesa de trabajo o en un colgador de pared? Eso es lo que hace la $PATHvariable de entorno. Contiene una lista de lugares en los que el shell busca y el orden en el que se buscarán.

Si desea ver si un comando es un comando interno de shell, un alias, una función o un mv / work / unfile binario independiente, puede usar el typecomando como se muestra a continuación:

escriba claro
tipo cd

Los comandos "type clear" y "type cd" en una ventana de terminal.

Esto nos dice que cleares un archivo binario, y el primero que se encuentra en la ruta se encuentra en /usr/binEs posible que tenga más de una versión de clearinstalada en su computadora, pero esta es la que el shell intentará usar.

Como era de esperar, cdes un shell incorporado.

Listando su $ PATH

Es fácil ver lo que hay en tu camino. Simplemente escriba lo siguiente para usar el echocomando e imprimir el valor contenido en la $PATHvariable:

echo $ PATH

El comando "echo $ PATH" en una ventana de terminal.

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

Podemos elegir nuestro camino a través de la lista para ver las ubicaciones del sistema de archivos que se buscarán y el orden en el 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 enumerados y solo los directorios enumerados.

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

Para demostrar esto, creamos un pequeño programa llamado rfCuando se ejecuta,  rfimprime el nombre del directorio desde el que se inició en la ventana del terminal. Está ubicado en /usr/local/binTambién tenemos una versión más reciente en el /dave/workdirectorio.

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

cual rf

El comando "which rf" en una ventana de terminal.

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

Escribimos lo siguiente para encenderlo:

rf

El comando "rf" en una ventana de terminal.

La versión 1.0 de rffunciona 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 comando, como se muestra a continuación:

./work/rf

El comando "./work/rf" en una ventana de terminal.

Ahora que le hemos dicho al shell dónde encontrar la versión de rfque queremos ejecutar, usa la versión 1.1. Si preferimos esta versión, podemos copiarla en el /usr/local/bindirectorio y sobrescribir la anterior.

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

O tal vez hemos descargado una nueva versión rf y queremos hacer algunas pruebas de verificación antes de que esté disponible públicamente.

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

Agregar un directorio a su $ PATH

Puede usar el exportcomando para agregar un directorio al $PATHLuego, el directorio se incluye en la lista de ubicaciones del sistema de archivos que busca el shell. Cuando el shell encuentra un ejecutable coincidente, detiene la búsqueda, por lo que debe asegurarse de que busque primero en su 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 para que sea la primera ubicación buscada:

export PATH = / home / dave / work: $ PATH

El comando "export PATH = / home / dave / work: $ PATH" en una ventana de terminal.

Este comando se establece $PATHpara ser igual al directorio que estamos agregando /home/dave/work, y luego a toda la ruta actual.

El primero PATHno tiene signo de dólar ( $). Establecemos el valor para PATHLa final $PATHtiene un signo de dólar porque estamos haciendo referencia al contenido almacenado en la PATHvariable. Además, tenga en cuenta los dos puntos ( :) entre el nuevo directorio y el $PATHnombre de la variable.

Veamos cómo se ve el camino ahora:

echo $ PATH

El comando "echo $ PATH" en una ventana de terminal.

Nuestro /home/dave/workdirectorio se agrega al inicio de la ruta. Los dos puntos que proporcionamos lo separan del resto del camino.

Escribimos lo siguiente para verificar que nuestra versión de rfes la primera que encontramos:

cual rf

El comando "which rf" en una ventana de terminal.

La prueba en el pudín se está ejecutando rf, como se muestra a continuación:

rf

El comando "rf" en una ventana de terminal.

El 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í:

export PATH = $ PATH: / home / dave / work

Hacer los cambios permanentes

Como  dijo Beth Brooke-Marciniak, "El éxito está bien, pero el éxito es fugaz". En el momento en que cierra la ventana de la terminal, todos los cambios que haya realizado en el $PATH . Para que sean permanentes, debe poner su exportcomando en un archivo de configuración.

Cuando coloca el exportcomando en su .bashrcarchivo, establece la ruta cada vez que abre una ventana de terminal. A diferencia de las  SSHsesiones, para las que debe iniciar sesión, se denominan sesiones "interactivas".

En el pasado, pondría el exportcomando en su .profilearchivo para establecer la ruta para iniciar sesión en las sesiones de terminal.

Sin embargo, descubrimos que si colocamos el exportcomando en los archivos .bashrco  .profile, establece correctamente la ruta para las sesiones interactivas y para iniciar sesión en la terminal. Tu experiencia puede ser diferente. Para manejar todas las eventualidades, le mostraremos cómo hacerlo en ambos archivos.

Utilice el siguiente comando en su /homedirectorio para editar el .bashrcarchivo:

gedit .bashrc

El comando "gedit .bashrc" en una ventana de terminal.

El gediteditor se  abre con el .bashrcarchivo cargado.

El editor gedit con el archivo ".bashrc" cargado.

Desplácese hasta la parte inferior del archivo y luego agregue el siguiente comando de exportación que usamos anteriormente:

export PATH = / home / dave / work: $ PATH

Guarda el archivo. A continuación, cierre y vuelva a abrir la ventana de terminal o use el dotcomando para leer el .bashrcarchivo, de la siguiente manera:

. .bashrc

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

echo $ PATH

Los comandos ". .Bashrc" y "echo $ PATH" en una ventana de terminal.

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

El proceso para agregar el comando al .profilearchivo es el mismo. Escriba el siguiente comando:

gedit .profile

El comando "gedit .profile" en una ventana de terminal.

El gediteditor se inicia con el .profilearchivo cargado.

El editor gedit con el archivo ".profile" cargado.

Agregue el exportcomando al final del archivo y luego guárdelo. Cerrar y abrir una nueva ventana de terminal no es suficiente para forzar la .profilelectura del archivo. Para que la nueva configuración surta efecto, debe cerrar la sesión y volver a iniciarla o usar el dotcomando como se muestra a continuación:

. .perfil

Estableciendo el camino para todos

Para establecer la ruta para todos los que usan el sistema, puede editar el /etc/profilearchivo.

Deberá usar sudo, de la siguiente manera:

sudo gedit / etc / profile

Cuando se geditinicie el editor, agregue el comando de exportación al final del archivo.

El editor gedit con el archivo "/ etc / profile" cargado.

Guarde y cierre el archivo. Los cambios se aplicarán a los demás la próxima vez que inicien sesión.

Una nota sobre seguridad

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

El comando "echo $ PATH" con dos puntos resaltados en una ventana de terminal.

Si lo hace, esto buscará primero en el directorio actual, lo que presenta un riesgo de seguridad. Supongamos que descargó un archivo de almacenamiento y lo descomprimió en un directorio. Miras los archivos y ves otro archivo comprimido. Llamas a descomprimir 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 lo activaría en lugar del unzipejecutable real Esto sucedería porque el shell buscaría primero en el directorio actual.

Por lo tanto, siempre tenga cuidado al escribir sus exportcomandos. Use echo$ PATH para revisarlos y asegurarse de que estén de la manera que desea que sean.