Bash 'type someCmd': что означает 'hashed'? (разные выходы для типа mkdir)

Что меня озадачивает, так это то, что я получаю другой вывод при выполнении этого двухстрочного скрипта:

help | head -n1
type mkdir

из SciTE (здесь вывод панели SciTE):

GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
mkdir is /bin/mkdir

и из окна терминала (здесь вывод терминала):

GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
mkdir is hashed (/bin/mkdir)

Как получается, что один и тот же сценарий, выполняемый одной и той же оболочкой, дает разные результаты?

1 ответ

Решение

Разница ситуативная:

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

Это запоминание (кеширование) называется хешированием и происходит неявно через встроенный hash,

Поэтому, прежде чем mkdir когда-либо выполняется в данной сессии, type mkdir возвращает:

mkdir is /bin/mkdir

Выполнив mkdir хотя бы один раз, type mkdir затем сообщает:

mkdir is hashed (/bin/mkdir)

Ты можешь сказать bash "забыть" все запомненные пути с hash -r или выборочно с hash -d <name>; просто hash печатает все текущие хэшированные пути и их количество попаданий - см. help hash,

Другие вопросы по тегам