Команда hash является встроенной командой командной оболочки bash, предоставляющей пользователям доступ к кэшу путей к исполняемым файлам. Дело в том, что командная оболочка bash в процессе своей работы использует хэш-таблицу для кэширования путей к исполняемым файлам, причем эти пути определяются обычным образом с учетом значения переменной окружения PATH. Данный механизм предназначен для оптимизации производительности командной оболочки и может вообще не использоваться пользователями. Содержимое хэш-таблицы хранится до перезапуска командной оболочки и не сохраняется в каких-либо файлах, кроме того, оно может редактироваться пользователями.
Базовый синтаксис команды выглядит следующим образом:
$ hash [параметры]
Команда поддерживает различные параметры, позволяющие модифицировать кэш путей к исполняемым файлам. В частности, параметр -r позволяет очистить кэш путей к исполняемым файлам команд, параметр -d позволяет удалить путь к исполняемому файлу команды с заданным именем из кэша, параметр -p позволяет добавить путь к исполняемому файлу команды с заданным именем в кэш и параметр -t позволяет вывести хранящиеся в кэше пути к исполняемым файлам каждой из заданных команд.
Для вывода списка кэшированных путей к исполняемым файлам команд, выполненных с помощью командной оболочки, следует использовать команду hash без каких-либо параметров:
$ hash
вызовы команда
1 /usr/bin/whoami
1 /usr/bin/id
1 /bin/ls
…
Команда выведет длинный список команд с количеством вызовов каждой из них.
Если вы не хотите, чтобы пути к исполняемым файлам команд кэшировались командной оболочкой, вы можете использовать встроенную команду set. По сути, вы можете использовать команду set +h для деактивации соответствующего механизма и set -h для его активации:
$ set +h
$ hash
bash: hash: хэширование отключено
$ set -h
$ hash
вызовы команда
1 /usr/bin/whoami
1 /usr/bin/id
1 /bin/ls
…
Очевидно, что при деактивации кэш путей к исполняемым файлам команд не очищается.
Для удаления пути к исполняемому файлу отдельной команды достаточно использовать параметр -d команды hash и задать имя этой команды:
$ hash
вызовы команда
1 /usr/bin/whoami
1 /usr/bin/id
1 /bin/ls
…
$ hash -d ls
$ hash
вызовы команда
1 /usr/bin/whoami
1 /usr/bin/id
…
Очевидно, что запись, соответствующая команде ls, пропала из листинга.
Для того, чтобы добавить в кэш путь к исполняемому файлу команды, следует использовать параметр -p команды hash вместе с путем к исполняемому файлу добавляемой команды и именем этой команды:
$ helloworld
helloworld: команда не найдена
$ hash -p /home/alex/helloworld helloworld
$ helloworld
Hello world!
В данном случае я добавил в кэш путь к исполняемому файлу с именем helloworld для команды helloworld. После этого команда стала работать так, как нужно. Этот метод запуска бинарных файлов очень похож на метод с использованием псевдонимов командной оболочки. Вероятно, это единственный прием работы с командой hash, который может быть полезен для многих пользователей.
Для того, чтобы получить список путей к исполняемым файлам интересующих вас команд, достаточно использовать параметр -t команды hash и перечислить эти команды через пробел:
$ hash -t id helloworld
id /usr/bin/id
helloworld /home/alex/helloworld
Следует отметить, что в данном случае не выводятся значения количества вызовов каждой из команд.
Для очистки списка кэшированных путей к исполняемым файлам команд, выполненных с помощью командной оболочки, следует использовать команду hash с параметром -r:
$ hash
вызовы команда
2 /home/alex/helloworld
1 /usr/bin/whoami
2 /usr/bin/id
$ hash -r
$ hash
hash: таблица хэшей пустая
После очистки кэша он будет заполняться по новой, если вы не отключите соответствующий механизм.