¿Por qué Shell usa ejecutable en /usr/bin y no en /usr/local/bin

¿Por qué Shell usa ejecutable en /usr/bin y no en /usr/local/bin

Dado:

/usr/local/bin/cmake
/usr/bin/cmake
$ cmake # runs /usr/bin/cmake

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

¿Por qué esto y cómo hago para que el shell ejecute el ejecutable /usr/local/bin/cmakecuando escribo cmake(sin alias y similares)?

Respuesta1

El problema se reveló al ejecutar

$ type -f cmake
cmake is hashed (/usr/bin/cmake)

Y limpiando el hash de bash con

hash -d cmake

Luego de esto, cmakese interpretó como se esperaba.

Respuesta2

En algún momento anterior durante la misma sesión de shell, usted utilizó cmakey ese ejecutable se encontró en /usr/bin.

Luego instaló otro cmakeejecutable en formato /usr/local/bin.

El bashshell almacena en caché la primera ubicación que encuentra para cualquier comando externo que use, lo que significa que no tiene que realizar una búsqueda costosa del ejecutable la próxima vez que use el mismo comando. La desventaja de esto es que no se molestará en mirarde nuevocuando, más adelante, instale otro ejecutable con el mismo nombre, incluso si lo hace en un directorio anterior $PATHa la ubicación original.

La solución a este problema es vaciar las ubicaciones en caché de los ejecutables que bashguarda. Esto se hace con hash -r( rehashen el zshcaparazón). Para olvidar solo la ubicación del cmakeejecutable, use hash -d cmake( unhash cmakeen el zshshell).


Una versión anterior de esta pregunta también preguntaba por qué los dos comandos type cmakedaban which cmakeresultados diferentes, donde which cmakeparecía dar el resultado esperado ( /usr/local/bin/cmake) mientras que type cmakeparecía dar el resultado incorrecto ( /usr/bin/cmake).

La respuesta a esto es que typees un comando integrado que bashusará las mismas ubicaciones en caché de los comandos que usa el shell, y eso whichesnoun comando incorporado y, por lo tanto, no podrá utilizar esas ubicaciones almacenadas en caché de los ejecutables.

En este caso, whichdio el resultado esperado porque hizo una búsqueda cmakeen su $PATH, pero en realidad era elequivocadoresultado, ya que ejecutar cmakeen la línea de comando de hechonorecogerlo /usr/local/bin(debido al almacenamiento en caché, que whichno sabríamos).

whichAquí encontrará un resumen de la historia de y los peligros de su uso:¿Por qué no utilizar "cuál"? ¿Qué usar entonces?

información relacionada