Preferencia PATH en bashrc

2

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?"

user2979409
fuente
Los directorios se prueban en orden, de izquierda a derecha.
ctrl-alt-delor
¿Qué quieres decir? No sigo lo que dices.
user2979409
Tengo una pregunta sobre tu pregunta. ¿Cuestionaría ser el mismo si no intenta ejecutar el archivo antes de copiarlo en otro lugar?
ctrl-alt-delor
No estoy en una computadora con Linux instalado ahora. Soy libre de preguntar, ¿verdad¿
user2979409
únete a mí para charlar, para que pueda descubrir más claramente cuál es la pregunta. - chat.stackexchange.com/rooms/15994/…
ctrl-alt-delor

Respuestas:

4

La respuesta rapida

Para saber qué copia bash tratará de ejecutar, usa la utilidad incorporada del bash type. Para saber qué copia de du, por ejemplo, se ejecutará, ejecute:

$ type du
du is /usr/bin/du

La teoría

Cuando pidas bash ejecutar algo bash 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 ejecutado

En 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:

$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'

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:

$ 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 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:

$ alias dd=/opt/bin/dd

Después de establecer el alias anterior, puede escribir dd en la línea de comando y bash ignorará el caché e ignorará el PATH, y ejecutará (o intentará ejecutar) /opt/bin/dd.

John1024
fuente