Що означає "хм хеш"?


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там вбудовані команди.


15

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

Ви можете попередньо завантажити хеш, подавши список команд, які ви хочете, щоб Bash знаходив, коли його викликали. Ця змінна називається BASH_CMDS.

уривок зі сторінки man

   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 man, є розділ під назвою КОМАНДА ВИКОНАННЯ, в якому детально описується стан машини, який використовує 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

дуже корисно дякую Під час роботи над сценарієм я виявляю, що ця хеш-річ стає на шляху. Чи є спосіб відключити чи очистити це?
qodeninja

10

hash - це вбудована оболонка Bash, яка забезпечує хешування команд.

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

Прямо з уст коня:

help hash

Запам’ятайте або показуйте місця розташування програми.

info Bash → Команди Шелл Булдін → Борн Шелл

Запам’ятайте повні назви команд, вказані як аргументи NAME, тому їх не потрібно шукати при наступних викликах. Команди знаходять за допомогою пошуку в каталогах, перелічених у $PATH. Цей -pпараметр забороняє пошук шляху, а FILENAME використовується як місце NAME. Цей -rпараметр змушує оболонку забути всі запам'ятовані місця. Цей -dпараметр змушує оболонку забути запам'ятоване місце кожного імені. Якщо -tпараметр надається, друкується повне ім'я шляху, якому відповідає кожне ІМ'Я. Якщо з NAME подано кілька аргументів -tNAME, друкується перед хешованим повним іменем шляху. Цей -lпараметр призводить до відображення виводу у форматі, який може бути використаний повторно як введення. Якщо ніяких аргументів не наводиться, або якщо тільки-lнадається, друкується інформація про запам’ятовуються команди. Статус повернення дорівнює нулю, якщо NAME не знайдено або не вказано недійсний варіант.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.