Me preguntaba qué sucede 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 también está configurado en PATH y ejecuto desde la terminal ese archivo, ¿qué copia estoy ejecutando?
¿Puedo establecer una preferencia para que diga "si un archivo existe en más de un lugar dentro de PATH, ejecutarlo en primer lugar en lugar de ejecutarlo en segundo lugar?".
Respuesta1
La respuesta rápida
Para saber qué copia bash
intentará ejecutarse, utilice la utilidad incorporada de bash type
. Para saber qué copia de du
, por ejemplo, se ejecutará, ejecute:
$ type du
du is /usr/bin/du
La teoría
Cuando pides bash
ejecutar algo, bash
realiza dos pasos:
Primero, verifica en su caché la ubicación del archivo. Esta es una lista de nombres de ejecutables y dónde se encontraba el archivo la última vez que bash
lo ejecutó.
En segundo lugar, si el archivo no está en el caché, verifica 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 realizar la copia. Si es así, bash
es posible que haya guardado su ubicación en el caché y lo hará.ignorarcualquier ubicación nueva en la que pueda estar después de hacer copias. Si no está en la memoria caché, el archivo que se ejecuta depende únicamente del orden de los directorios en la ruta.
Más detalles
Para ver qué hay en el caché actual de bash, ejecute:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'
Lo anterior muestra que solo du
estaba en el caché cuando lo ejecuté. Si ejecutara más comandos y luego los ejecutara nuevamente, habría más en el caché.
Para ver cuál es la ruta actual, ejecute:
$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin
La ruta es una lista separada por dos puntos. Lo anterior muestra cinco directorios en la ruta. Se buscarán comenzando desde la izquierda y avanzando hacia la derecha.
¿Puedo establecer una preferencia?
Sí, puedes cambiar el orden de los directorios en la ruta.
Alternativamente, para trabajo interactivo, puede establecer un alias. Por ejemplo:
$ alias dd=/opt/bin/dd
Una vez configurado el alias anterior, puede escribir dd
en la línea de comando e bash
ignorará el caché e ignorará la RUTA, y ejecutará (o intentará ejecutar) /opt/bin/dd
.