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
,