Что означает «rm is hashed»?

58

Я иду через http://mywiki.wooledge.org/BashGuide/CommandsAndArguments и наткнулся на это:

$ type rm
rm is hashed (/bin/rm)
$ type cd
cd is a shell builtin

Чуть раньше в руководстве были перечислены различные типы команд, понятные Bash: псевдонимы, функции, встроенные функции, ключевые слова и исполняемые файлы. Но не было упоминания о «хешированном». Итак, что в этом контексте означает «хэширование»?

Жиль "ТАК - перестань быть злым"
источник

Ответы:

59

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

Смотрите также help hash, или man bashи ищите там hashвстроенные команды.

frostschutz
источник
15

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

Вы можете предварительно загрузить хеш, указав список команд, которые вы хотите, чтобы Bash нашел при его вызове. Эта переменная называется BASH_CMDS.

выдержка из справочной страницы

   BASH_CMDS
          An  associative  array  variable  whose members correspond to the 
          internal hash table of commands as maintained by the hash builtin.
          Elements added to this array appear in the hash table; unsetting 
          array elements cause commands to be removed from the hash table.

Кроме того, если вы посмотрите на справочную страницу Bash, есть раздел под названием COMMAND EXECUTION, в котором подробно описывается конечный автомат, который Bash использует при вводе команды в командной строке.

выдержка

   If the name is neither a shell function nor a builtin, and contains no 
   slashes, bash searches each element of the PATH for a directory con
   taining an executable file by that name.  Bash uses a hash table to 
   remember the full pathnames of executable files (see hash  under  SHELL
   BUILTIN COMMANDS below).  A full search of the directories in PATH is 
   performed only if the command is not found in the hash table.  If the
   search is unsuccessful, the shell searches for a defined shell function 
   named command_not_found_handle.  If that  function  exists,  it  is
   invoked  with  the  original command and the original command's arguments 
   as its arguments, and the function's exit status becomes the exit
   status of the shell.  If that function is not defined, the shell prints 
   an error message and returns an exit status of 127.

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

пример

$ hash -l
builtin hash -p /usr/bin/rm rm
builtin hash -p /usr/bin/sudo sudo
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/ls ls
SLM
источник
очень полезно спасибо В то время как я работаю над сценарием, я нахожу, что это мешает. Есть ли способ отключить или очистить это?
qodeninja
10

hash встроенная оболочка Bash, которая обеспечивает хеширование команд

hash [-lr] [-p filename] [-dt] [name]

Прямо изо рта лошади:

help hash

Запомните или отобразите местоположения программы.

info Bash → Команды Shell Builtin → Встроенные команды Bourne Shell

Запомните полные пути команд, указанных в качестве аргументов NAME, поэтому их не нужно искать при последующих вызовах. Команды можно найти путем поиска в каталогах, перечисленных в $PATH. -pОпция запрещает поиск пути, и FILENAME используется в качестве места NAME. -rОпция заставляет оболочку забыть все сохраненные места. -dОпция заставляет оболочку забыть запомненное местоположение каждого ИМЕНИ. Если -tопция указана, печатается полный путь, которому соответствует каждое ИМЯ. Если несколько аргументов NAME предоставляются вместе -tс NAME, печатается перед хэшированным полным путем. Эта -lопция заставляет вывод отображаться в формате, который может быть повторно использован в качестве ввода. Если аргументы не приводятся, или если только-lпредоставляется информация о запомненных командах. Статус возврата равен нулю, если имя не найдено или указан неверный параметр.

Рубан Савви
источник