1

Я искал, что делает команда rehash и нашел это:

Команда rehash пересчитывает внутреннюю хеш-таблицу содержимого каталогов, перечисленных в переменной окружения path, чтобы учесть добавленные новые команды.

Я никогда не знал ни о каких внутренних хеш-таблицах. Почему и как они поддерживаются?

2 ответа2

5

Когда вы вводите команду, если бы не было хеш-таблицы, оболочка проверила бы каждый каталог, указанный в $PATH чтобы увидеть, есть ли там ваша команда.

Это может быть медленным процессом, если какой-либо из этих каталогов подключен к медленному устройству. Вы получите паузу каждый раз, когда вводите команду.

Итак, когда оболочка начинает работать, она читает каждый каталог в $PATH и определяет, что представляют собой все исполняемые программы, а затем сохраняет этот список в хэш-таблице в памяти. Затем ему больше не нужно проверять их, и он может быстро узнать, действительна ли введенная вами команда или нет.

Это прекрасно работает, если вы никогда не добавляете и не удаляете программы, потому что, как только вы это сделаете, хеш-таблица устареет. Цель команды rehash - попросить, чтобы оболочка снова пошла и прочитала список программ.

Вышесказанное относится к csh и tcsh .

С оболочкой bash она не читает имена всех ваших программ при запуске. Он хранит хеш-таблицу, но помещает в нее только то, что вы вводите команды. Например:

bash-3.2$ ls
foo bar baz
bash-3.2$ cp
cp: missing file operand
Try `cp --help' for more information.
bash-3.2$ hash
hits    command
   1    /bin/cp
   1    /bin/ls

Он запомнил расположение команд cp и ls .

1

Как правило, все просто, хотя есть различия между оболочками. Чтобы избежать ненужного ввода-вывода, оболочка поддерживает таблицу, отображающую имена исполняемых файлов на их полные пути.

zsh имеет две опции, связанные с этим, обе включены по умолчанию:

HASH_CMDS <D>

Обратите внимание на расположение каждой команды при первом ее выполнении. Последующие вызовы той же команды будут использовать сохраненное местоположение, избегая поиска пути. Если эта опция не установлена, хеширование пути не выполняется вообще. Однако, когда установлено значение ПРАВИЛЬНО, команды, имена которых не отображаются в хеш-таблицах функций или псевдонимов, хэшируются, чтобы избежать сообщения о них как об орфографических ошибках.

HASH_DIRS <D>

Всякий раз, когда имя команды хэшируется, хешируйте каталог, содержащий его, а также все каталоги, которые находятся ранее в пути. Не имеет эффекта, если не установлены ни HASH_CMDS, ни CORRECT.

С этими параметрами добавление каталогов (и новых команд) в PATH должно работать как задумано. Однако, если вы добавляете каталог к пути, который должен иметь приоритет над определенной командой (например, /usr/local/bin/ls), вам, возможно, придется перефразировать или перезапустить оболочку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .