почему shell использует исполняемый файл в /usr/bin, а не в /usr/local/bin

почему shell использует исполняемый файл в /usr/bin, а не в /usr/local/bin

Данный:

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

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

Почему это так, и как мне заставить оболочку запускать исполняемый файл /usr/local/bin/cmakeпри вводе текста cmake(без псевдонимов и т. п.)?

решение1

Проблема была выявлена ​​при запуске

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

И очистка хэша bash с помощью

hash -d cmake

После этого cmakeбыло истолковано так, как и ожидалось.

решение2

Ранее в ходе того же сеанса работы с оболочкой вы использовали cmakeи этот исполняемый файл был найден в /usr/bin.

Затем вы установили другой cmakeисполняемый файл в формате /usr/local/bin.

Оболочка bashкэширует первое местоположение, которое она находит для любой внешней команды, которую вы используете, что означает, что ей не нужно делать дорогостоящий поиск исполняемого файла в следующий раз, когда вы используете ту же команду. Недостаток этого в том, что она не будет беспокоиться о поискесновакогда вы позже устанавливаете другой исполняемый файл с тем же именем, даже если это делается в каталоге, который находится раньше $PATHисходного местоположения.

Решение этой проблемы — очистить кэшированные расположения исполняемых файлов, которые bashсохраняются. Это делается с помощью hash -r( rehashв zshоболочке). Чтобы забыть только расположение cmakeисполняемого файла, используйте hash -d cmake( unhash cmakeв zshоболочке).


В более ранней версии этого вопроса дополнительно задавался вопрос, почему две команды type cmakeдали which cmakeразные результаты, одна из которых, which cmakeказалось, дала ожидаемый результат ( /usr/local/bin/cmake), а другая type cmake, казалось, дала неправильный результат ( /usr/bin/cmake).

Ответ на этот вопрос заключается в том, что typeэто встроенная команда, bashкоторая будет использовать те же кэшированные расположения команд, что и оболочка, и whichэтонетвстроенная команда и, следовательно, не сможет использовать эти кэшированные расположения исполняемых файлов.

В этом случае, whichдал ожидаемый результат, потому что он выполнил поиск cmakeв вашем $PATH, но на самом деле это былнеправильныйрезультат, так как запуск cmakeв командной строке фактическинетзабрать его из /usr/local/bin(из-за кэширования, whichо котором никто не будет знать).

Краткое изложение истории whichи подводных камней его использования можно найти здесь:Почему бы не использовать "which"? Что тогда использовать?

Связанный контент