Apa yang dimaksud dengan "rm is hashed"?

58

Saya akan membaca http://mywiki.wooledge.org/BashGuide/CommandsAndArguments dan menemukan ini:

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

Beberapa saat sebelumnya, panduan ini mencantumkan berbagai jenis perintah yang dipahami oleh Bash: alias, fungsi, bawaan, kata kunci, dan yang dapat dieksekusi. Tapi tidak disebutkan "hash". Jadi, dalam konteks ini, apa artinya "hash"?

Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

59

Ini hal kinerja; alih-alih mencari seluruh path untuk biner setiap kali dipanggil, ia dimasukkan ke tabel hash untuk pencarian yang lebih cepat. Jadi setiap biner yang sudah ada di tabel hash ini, di-hash. Jika Anda memindahkan binari saat hash sudah selesai, ia masih akan mencoba memanggilnya di lokasi lama.

Lihat juga help hash, atau man bashdan cari di hashbawah perintah builtin di sana.

frostschutz
sumber
15

Seperti orang lain telah menyebutkan hash adalah array asosiatif (kunci -> nilai) yang dipertahankan Bash sehingga ketika sebuah perintah dieksekusi, Bash mencari hash ini terlebih dahulu untuk melihat apakah lokasi perintah pada disk telah ditemukan melalui $PATH, dan disimpan di sana untuk pencarian lebih cepat.

Anda dapat melakukan preload hash dengan memberikan daftar perintah yang Anda inginkan untuk ditemukan Bash ketika dipanggil. Variabel ini disebut BASH_CMDS.

kutipan dari halaman manual

   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.

Selain itu jika Anda melihat halaman manual Bash ada bagian berjudul, PERINTAH EKSEKUSI yang merinci mesin negara yang digunakan Bash saat perintah diketik di prompt.

kutipan

   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.

Anda dapat mengetahui apa yang saat ini ada di hash Anda menggunakan -lsakelar.

Contoh

$ 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
sumber
sangat membantu terima kasih. Sementara saya sedang mengerjakan sebuah skrip, saya menemukan hash ini menghalangi. Apakah ada cara untuk menonaktifkan atau menghapus ini?
qodeninja
10

hash adalah built-in Bash shell yang menyediakan hashing untuk perintah.

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

Langsung dari mulut kuda:

help hash

Ingat atau tampilkan lokasi program.

info Bash → Shell Builtin Command → Bourne Shell Builtins

Ingat nama path lengkap dari perintah yang ditentukan sebagai argumen NAME, sehingga perintah tersebut tidak perlu dicari pada permintaan berikutnya. Perintah ditemukan dengan mencari melalui direktori yang terdaftar di $PATH. The -ppilihan menghambat pencarian jalan, dan FILENAME digunakan sebagai lokasi NAMA. The -rmenyebabkan shell untuk melupakan semua lokasi diingat. The -dpilihan menyebabkan shell untuk melupakan lokasi diingat dari setiap NAMA. Jika -topsi ini diberikan, nama path lengkap tempat masing-masing NAMA terkait dicetak. Jika beberapa argumen NAME diberikan dengan -tNAME dicetak sebelum pathhed nama lengkap. The -lpilihan menyebabkan output yang akan ditampilkan dalam format yang dapat digunakan kembali sebagai masukan. Jika tidak ada argumen yang diberikan, atau jika hanya-ldisediakan, informasi tentang perintah yang diingat dicetak. Status pengembaliannya nol kecuali NAMA tidak ditemukan atau opsi yang tidak valid diberikan.

Ruban Savvy
sumber