Почему внутренняя таблица каталогов PATH сохраняется?

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

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

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

1
задан 02.08.2010, 21:34

2 ответа

При вводе команды если бы не было никакой хеш-таблицы, то оболочка проверила бы каждый каталог, перечисленный в $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 команды.

5
ответ дан 12.12.2019, 08:16

Это обычно просто, хотя существуют изменения между оболочками. Для предотвращения ненужного IO оболочка поддерживает таблицу, отображающую исполняемые имена к их полным путям.

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

HASH_CMDS <D>

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

HASH_DIRS <D>

Каждый раз, когда название команды хешируется, хешируйте каталог, содержащий его, а также все каталоги, которые происходят ранее в пути. Не имеет никакого эффекта, если ни HASH_CMDS, ни КОРРЕКТНЫЙ не установлен.

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

1
ответ дан 12.12.2019, 08:16

Теги

Похожие вопросы