Вопрос или проблема
Недавно я полностью перешел на Linux с Windows, и когда попытался обновить мой пакет npm
с помощью n
, я получил новые бинарные файлы в /usr/local/bin
, а предыдущая версия была в /usr/bin
. Поэтому всегда выбиралась предыдущая версия.
По рекомендации одного пользователя я использовал команду hash -r
, и это сработало. Но я не знаю, что именно эта команда сделала.
Было бы очень полезно, если бы кто-то мог объяснить мне её внутренности.
hash
— это встроенная команда в оболочку bash
. Для краткой информации о том, что она делает, можно ввести help hash
в командной строке:
$ help hash
hash: hash [-lr] [-p pathname] [-dt] [name ...]
Запомнить или показать расположение программ.
Определяет и запоминает полный путь к каждой команде NAME. Если
аргументы не указаны, отображается информация о запомненных командах.
Опции:
-d забыть запомненное расположение каждой NAME
-l отобразить в формате, который может быть использован в качестве входных данных
-p pathname использовать PATHNAME в качестве полного пути для NAME
-r забыть все запомненные расположения
-t распечатать запомненное расположение каждой NAME, предшествуя
каждой локации соответствующей NAME, если указано несколько
NAME
Аргументы:
NAME Каждое NAME ищется в $PATH и добавляется в список
запомненных команд.
Выходной статус:
Возвращает успех, если NAME не найдено или указана неверная опция.
Таким образом, hash
запоминает расположение программ, а hash -r
их забывает.
Оболочка отслеживает, где находятся исполняемые файлы, такие как npm
, чтобы не искать переменную окружения PATH
каждый раз при запуске чего-либо.
-
Аргумент
-r
(сброс) для hash очищает кэш. -
Если вы хотите увидеть, какие команды hash запомнил, просто наберите hash без каких-либо аргументов.
Вы можете отключить кэш полностью, набрав set +h
, и снова включить его с помощью set -h
.
Ответ или решение
Команда hash -r
в оболочке bash
играет важную роль в управлении кэшем путей к исполнимым файлам. Понимание её функциональности особенно полезно для пользователей, которые часто перемещаются между различными версиями утилит, такими как npm
. В вашем конкретном случае, обновление пакета через n
привело к тому, что новые бинарные файлы оказались в /usr/local/bin
, в то время как предыдущая версия находилась в /usr/bin
. Это могло привести к тому, что система продолжала использовать устаревшую версию. В этой ситуации команда hash -r
оказалась полезной.
Теория
Введение в команду hash
hash
— это встроенная команда в bash
, обеспечивающая более эффективное выполнение программ. Одна из её основных функций заключается в запоминании полных путей к уже выполненным программам. Обычно, при выполнении команды, bash
ищет её в директориях, перечисленных в переменной окружения PATH
. Для оптимизации этого процесса и для сокращения времени поиска, bash
кэширует пути к исполнимым файлам, которые уже были вызваны, в специальном списке.
Команда hash -r
Флаг -r
у команды hash
используется для сброса этого кэша. Когда вы применяете hash -r
, вы удаляете из памяти bash
все сохраненные пути к программам, заставляя оболочку заново искать пути в PATH
при следующем запуске любой команды. Это особенно полезно в ситуациях, когда местоположение исполняемых файлов изменилось, например, из-за обновления или переустановки программ, как в вашем случае.
Пример
Рассмотрим пример с npm
. Допустим, изначальная версия npm
была установлена в /usr/bin
, и вы обновили её, так что новая версия находится в /usr/local/bin
. Если ранее bash
уже запоминал путь к старой версии npm
в своем кэше, например, как /usr/bin/npm
, он будет продолжать использовать этот путь при каждом вводе npm
в консоль.
Для решения этой проблемы вводится команда:
hash -r
Эта команда очистит запомненные пути, и при следующем вводе npm
bash
заново произведет поиск по PATH
, обнаружив новую версию npm
в /usr/local/bin
.
Применение
Использование hash -r
особенно полезно в следующих случаях:
-
Обновление программ: Когда вы обновляете программные пакеты, и они устанавливаются в новое расположение.
-
Изменение
PATH
: Если вы модифицируете переменнуюPATH
, добавляя или удаляя директивы. -
Переключение между версиями: Во время разработки, когда необходимо переключаться между различными версиями одних и тех же утилит, чтобы гарантировать, что используется правильная версия.
-
Устранение неполадок: В случаях, когда запуск программы вызывает неожиданный результат, продиктованный использованием неверного исполнимого файла.
Как посмотреть список запомненных команд
Для просмотра текущего состояния кэша используйте просто команду:
hash
Это покажет все команды и их запомненные пути.
Дополнительно
Если вы ожидаете частые изменения в установленных программах, можно временно отключать кэширование с помощью:
set +h
и снова включать его:
set -h
Подытожим:
Команда hash -r
является важным инструментом в арсенале пользователя bash
, предоставляя возможность контролировать, каким образом оболочка взаимодействует с системными утилитами, улучшая производительность и предсказуемость её работы. В контексте вашего перехода на Linux она обернулась решением проблемы конфликта версий программы.
Таким образом, понимание и умение управлять командами, такими как hash
, повышают эффективность работы в командной строке и помогают избежать типичных проблем, связанных с путями к исполняемым файлам.