Команда hash

Команда 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: таблица хэшей пустая

После очистки кэша он будет заполняться по новой, если вы не отключите соответствующий механизм.