hash
это встроенная команда bash Хэш-таблица - это функция, bash
которая предотвращает необходимость поиска при $PATH
каждом вводе команды путем кэширования результатов в памяти. Таблица очищается от событий, которые явно аннулируют результаты (например, изменение $PATH
)
Команда hash
- это то, как вы взаимодействуете с этой системой (по той причине, по которой вы чувствуете, что вам нужно).
Некоторые варианты использования:
Как вы видели, он печатает, сколько раз вы нажимаете какие команды, если вы вводите его без аргументов. Это может сказать вам, какие команды вы используете чаще всего.
Вы также можете использовать его для запоминания исполняемых файлов в нестандартных местах.
Пример:
[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you're thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#
Это может быть полезно, если у вас есть только один исполняемый файл в каталоге, $PATH
который вы хотите запустить, просто введите имя, а не включайте все в этот каталог (что будет иметь эффект, если вы добавите его в $PATH
).
Псевдоним, как правило, тоже может это делать, хотя, поскольку вы модифицируете поведение текущей оболочки, он не отображается в программах, которые вы запускаете. Символьная ссылка на одиночный исполняемый файл, вероятно, является предпочтительным вариантом здесь. hash
это один из способов сделать это.
- Вы можете использовать его для запоминания путей к файлам. Это полезно, если новый исполняемый файл появляется в более раннем
PATH
каталоге или получает mv
куда-то еще, и вы хотите заставить bash выйти и найти его снова, а не в последнем месте, которое он запомнил, найдя его.
Пример:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif newDIT.ldif notes.txt users.ldif
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /lol-wut/ls
[root@policyServer ~]#
Команда cp
вызвала появление новой версии ls
исполняемого файла ранее в моем, $PATH
но не запустила очистку хеш-таблицы. Раньше я hash -d
выборочно удалял запись ls
из хеш-таблицы. Затем Bash был вынужден просмотреть $PATH
снова, и когда он это сделал, он нашел его в более новом месте (ранее в $ PATH, чем раньше).
Вы можете выборочно вызвать это $PATH
поведение «найти новое расположение исполняемого файла из », хотя:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
В большинстве случаев вы просто захотите сделать это, если вы хотите что-то из хеш-таблицы и не на 100% можете выйти из системы, а затем вернуться обратно или хотите сохранить некоторые изменения, внесенные в вашу оболочку.
Чтобы избавиться от устаревших отображений, вы также можете сделать hash -r
(или export PATH=$PATH
), который эффективно просто удаляет всю хэш-таблицу bash.
Есть много таких маленьких ситуаций. Я не знаю, назову ли я это одной из «самых полезных» команд, но у нее есть некоторые варианты использования.
hash
команда внутренне использует хеш-таблицу для хранения отображений. en.wikipedia.org/wiki/Hash_tablehash
это не являетсяbash
специфическим, команда, созданная в оболочке Bourne в SVR2 (хотя функция хеширования путей команд появиласьcsh
ранее), встречается во всех оболочках Bourne-like и POSIX.export PATH=$PATH
чтобы очистить таблицу,hash -r
должно хватить.hash -r
или вы получите старую версию, потому что $ PATH не изменился, и поэтому Bash не осознает, что может загрузить ту же программу из более раннего каталога (с более высоким приоритетом). Смотрите conda.pydata.org/docs/… для подробностей.Вот классическое упрощенное использование:
источник
hash hello
.setopt -s checkhash
если хешированный исполняемый файл для команды больше не существует, хеш-запись для этой команды будет обновлена. Но обратите внимание, что у каждого сеанса bash была своя собственная хеш-таблица, поэтому закрытие сеанса и запуск нового эффективно очищает хеш. (hash -r
это более простой способ сделать это.)$PATH
или запуск нового терминала bash, оба, кажется, очищают таблицу.Вот полезное использование
hash
:Это означает: если php отсутствует в PATH, используйте
источник
Да, Справочное руководство Bash гласит:
Но вы можете отключить хеширование с помощью
set +h
:Пытаться:
То же самое для
hash -r
иhash NAME
т. Д.«Обнаружение команды» (вроде того или другого ) не работает:
Вы можете написать что-то вроде этого:
или (спасибо @mikeserv) без необходимости присваивать новые переменные или выполнять какие-либо тесты:
источник
old_options
дела - я обычно делаю что-то вроде этого:set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"
так что все просто становится на свои места автоматически, без необходимости присваивать какие-либо новые переменные или делать какие-либо тесты или что-то еще.Легко определить, доступна ли команда:
источник