“Hash hashed” ne demektir?


58

Http://mywiki.wooledge.org/BashGuide/CommandsAndArguments adresinden geçiyorum ve şuna rastladım:

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

Biraz önce, rehber Bash tarafından anlaşılan çeşitli komut türlerini listeledi: takma adlar, fonksiyonlar, yerleşikler, anahtar kelimeler ve çalıştırılabilirler. Ancak "karma" dan söz edilmedi. Peki, bu bağlamda, "karma" ne anlama geliyor?

Yanıtlar:


59

Bu bir performans olayıdır; her çağrıldığında ikili yolun tamamını aramak yerine, daha hızlı arama için bir karma tabloya yerleştirilir. Bu yüzden zaten bu hash tablosunda olan herhangi bir ikili hash vardır. İkili dosyaları zaten karma olduklarında hareket ettirirseniz, onları eski konumlarında aramaya çalışır.

Ayrıca bakınız help hashveya orada yerleşik komutların altında man basharama yapın hash.


15

Diğerlerinin de dediği gibi, bir komut yürütüldüğünde Bash'in tuttuğu bir komut dizisidir (key -> value), böylece bir komut yürütüldüğünde, Bash komutun diskteki konumunun zaten bulunup $PATHbulunmadığını ve orada saklanıp saklanmadığını görmek için önce bu hash'ı arar. daha hızlı arama için.

Bash'in çağrıldığında bulmasını istediğiniz komutların listesini vererek önyükleme yapabilirsiniz. Bu değişken denir BASH_CMDS.

man sayfasından alıntı

   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.

Ek olarak, Bash adam sayfasına bakarsanız, komut isteminde bir komut yazıldığında Bash'in kullandığı durum makinesini ayrıntılandıran KOMUTANMA YÜRÜTME başlıklı bir bölüm vardır .

alıntı

   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.

-lDüğmeyi kullanarak karma değerinizde şu anda ne olduğunu bulabilirsiniz .

Örnek

$ 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

çok yardımcı teşekkür ederim. Bir senaryo üzerinde çalışırken bu karmaşanın yoluna girdiğini biliyorum. Bunu devre dışı bırakmanın veya temizlemenin bir yolu var mı?
qodeninja

10

hash komutları için karma sağlayan yerleşik bir Bash kabuğudur.

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

Atın ağzından doğruca:

help hash

Program konumlarını hatırlayın veya görüntüleyin.

info Bash → Kabuk Yerleşik Komutları → Bourne Kabuk Yerleşimleri

NAME argümanları olarak belirtilen komutların tam adlarını hatırlayın, bu nedenle sonraki çağrılar için aranmaları gerekmez. Komutlar, içinde listelenen dizinleri arayarak bulunur $PATH. -pSeçenek yol araması inhibe ve DOSYAADı ADI yeri olarak kullanılır. -rSeçeneği hatırlanan tüm konumları unutmak kabuk neden olur. -dSeçenek her AD için hatırlanan konumun unutmak kabuk neden olur. Eğer -tbir seçenek temin edilir, her bir AD karşılık gelen tam yol adı basılır. Birden fazla NAME argümanı varsa -tNAME, karma tam yol adından önce yazdırılır. -lSeçenek çıktı, girdi olarak tekrar kullanılmasını sağlayacak biçimde görüntülenmesine neden olur. Eğer argüman verilmezse veya sadece-lverilir, hatırlanan komutlarla ilgili bilgiler yazdırılır. Bir NAME bulunamadığı veya geçersiz bir seçenek belirtilmediği sürece iade durumu sıfırdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.