
Данный:
/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"? Что тогда использовать?