Что делает команда hash -r?

Вопрос или проблема

Недавно я полностью перешел на 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 особенно полезно в следующих случаях:

  1. Обновление программ: Когда вы обновляете программные пакеты, и они устанавливаются в новое расположение.

  2. Изменение PATH: Если вы модифицируете переменную PATH, добавляя или удаляя директивы.

  3. Переключение между версиями: Во время разработки, когда необходимо переключаться между различными версиями одних и тех же утилит, чтобы гарантировать, что используется правильная версия.

  4. Устранение неполадок: В случаях, когда запуск программы вызывает неожиданный результат, продиктованный использованием неверного исполнимого файла.

Как посмотреть список запомненных команд

Для просмотра текущего состояния кэша используйте просто команду:

hash

Это покажет все команды и их запомненные пути.

Дополнительно

Если вы ожидаете частые изменения в установленных программах, можно временно отключать кэширование с помощью:

set +h

и снова включать его:

set -h

Подытожим:

Команда hash -r является важным инструментом в арсенале пользователя bash, предоставляя возможность контролировать, каким образом оболочка взаимодействует с системными утилитами, улучшая производительность и предсказуемость её работы. В контексте вашего перехода на Linux она обернулась решением проблемы конфликта версий программы.

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

Оцените материал
Добавить комментарий

Капча загружается...