Ймовірно, у вас довгий набір PATH, і, щоб знайти виконуваний файл, оболонці потрібно шукати шлях. Щоб уникнути цього трудомісткого процесу щоразу, коли потрібно запустити програму, оболонка може зберігати список програм, які вона вже знайшла. Цей список називається "хеш". Коли оболонка каже, що whichхеш, це означає, що вона вже здійснила пошук PATH і знайшла whichта зберегла своє місцезнаходження в хеші.
man bash пояснює це так:
Bash використовує хеш-таблицю для запам'ятовування повних імен виконуваних файлів (див. Хеш під SHELL BUILTIN COMMANDS нижче). Повний пошук каталогів у PATH виконується лише в тому випадку, якщо команда не знайдена в хеш-таблиці.
Хоча хеш зазвичай прискорює операції з оболонками, є один випадок, коли це викликає проблеми. Якщо ви оновите свою систему і, як результат, деякі виконувані файли переміщуються на нове місце, оболонка може заплутатися. Рішення полягає в запуску, hash -rякий змушує оболонку забути всі хешовані місця та шукати PATH з нуля.
Чому в хеші відсутні деякі виконувані файли?
Виконаний файл не розміщується в хеші, поки ви не виконаєте принаймні один раз. Дотримуйтесь:
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python хеширується лише після його виконання.
Як вивчити, що є в хеші Баша
Вміст хеша доступний у bashмасиві BASH_CMDS. З командою ви можете бачити, що в ній declare -p BASH_CMDS. Коли відкрита нова оболонка або допоміжна оболонка, хеш порожній. Команди додаються по черзі під час їх використання. З нещодавно відкритої оболонки спостерігайте:
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
whichі не дляpython?