Me preguntaba qué pasaría en la siguiente situación. Supongamos que tengo un archivo ejecutable en un directorio que está en PATH en .bashrc. Si copio el archivo en otro directorio que está establecido en PATH también, y ejecuto desde la terminal ese archivo, ¿qué copia estoy ejecutando?
¿Puedo establecer una preferencia para decir "si un archivo existe en más de un lugar dentro de PATH, ejecútelo en primer lugar en lugar de eso en segundo lugar?"
Respuestas:
La respuesta rapida
Para saber qué copia
bash
tratará de ejecutar, usa la utilidad incorporada del bashtype
. Para saber qué copia dedu
, por ejemplo, se ejecutará, ejecute:La teoría
Cuando pidas
bash
ejecutar algobash
Realiza dos pasos:En primer lugar, comprueba su caché para la ubicación del archivo. Esta es una lista de nombres de ejecutables y donde se ubicó el archivo la última vez que
bash
ejecutadoEn segundo lugar, si el archivo no está en la memoria caché, comprueba la ruta, buscando cada directorio en la ruta de izquierda a derecha.
Tenga en cuenta que la respuesta, entonces, depende de si ejecutó el ejecutable en el shell actual antes de hacer la copia. Si es así,
bash
puede haber guardado su ubicación en el caché y lo hará ignorar cualquier ubicación nueva en la que pueda estar después de hacer copias. Si no está en el caché, entonces el archivo que se ejecuta depende solo del orden de los directorios en la ruta.Más detalles
Para ver qué hay en el caché actual de bash, ejecute:
Lo anterior muestra que solo
du
Estaba en el caché cuando ejecuté eso. Si ejecutara más comandos y luego lo ejecutara de nuevo, habría más en el caché.Para ver cuál es la ruta actual, ejecute:
La ruta es una lista separada por dos puntos. Lo anterior muestra cinco directorios en la ruta. Se buscarán comenzando por la izquierda y trabajando hacia la derecha.
¿Puedo establecer una preferencia?
Sí, puede cambiar el orden de los directorios en la ruta.
Alternativamente, para el trabajo interactivo, puede establecer un alias. Por ejemplo:
Después de establecer el alias anterior, puede escribir
dd
en la línea de comando ybash
ignorará el caché e ignorará el PATH, y ejecutará (o intentará ejecutar)/opt/bin/dd
.fuente