
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/cmake
cuando 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, cmake
se interpretó como se esperaba.
Respuesta2
En algún momento anterior durante la misma sesión de shell, usted utilizó cmake
y ese ejecutable se encontró en /usr/bin
.
Luego instaló otro cmake
ejecutable en formato /usr/local/bin
.
El bash
shell 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 $PATH
a la ubicación original.
La solución a este problema es vaciar las ubicaciones en caché de los ejecutables que bash
guarda. Esto se hace con hash -r
( rehash
en el zsh
caparazón). Para olvidar solo la ubicación del cmake
ejecutable, use hash -d cmake
( unhash cmake
en el zsh
shell).
Una versión anterior de esta pregunta también preguntaba por qué los dos comandos type cmake
daban which cmake
resultados diferentes, donde which cmake
parecía dar el resultado esperado ( /usr/local/bin/cmake
) mientras que type cmake
parecía dar el resultado incorrecto ( /usr/bin/cmake
).
La respuesta a esto es que type
es un comando integrado que bash
usará las mismas ubicaciones en caché de los comandos que usa el shell, y eso which
esnoun comando incorporado y, por lo tanto, no podrá utilizar esas ubicaciones almacenadas en caché de los ejecutables.
En este caso, which
dio el resultado esperado porque hizo una búsqueda cmake
en su $PATH
, pero en realidad era elequivocadoresultado, ya que ejecutar cmake
en la línea de comando de hechonorecogerlo /usr/local/bin
(debido al almacenamiento en caché, que which
no sabríamos).
which
Aquí encontrará un resumen de la historia de y los peligros de su uso:¿Por qué no utilizar "cuál"? ¿Qué usar entonces?