Pertanyaan Mengapa `ketik` yang mengatakan` yang merupakan hash '?


Dalam kasus shell-builtins (mis type diri):

$ type type
type is a shell builtin

$ which type
<Doesn't return anything since it's a shell builtin, silently exits>

Dalam hal perintah (biasanya) (mis python):

$ type python
python is /usr/bin/python

$ which python
/usr/bin/python

Dalam kasus which (yang merupakan perintah yang terletak di /usr/bin/which)

$ type which
which is hashed (/usr/bin/which)
$ which which
/usr/bin/which

Kenapa type which katakan itu which is hashed? Apa arti pentingnya which di-hash dan apa sebenarnya artinya?


24
2018-04-11 18:50


asal




Jawaban:


Anda mungkin memiliki set PATH panjang dan, untuk menemukan dieksekusi, shell perlu mencari jalan. Untuk menghindari proses yang memakan waktu setiap kali Anda ingin menjalankan program, shell dapat menyimpan daftar program yang telah ditemukan. Daftar itu disebut "hash." Ketika shell mengatakan itu which adalah hash, artinya sudah melakukan pencarian PATH dan ditemukan which dan menyimpan lokasinya di hash.

man bash menjelaskannya sebagai berikut:

Bash menggunakan tabel hash untuk mengingat nama path lengkap          file yang dapat dieksekusi (lihat hash di bawah SHELL BUILTIN COMMANDS di bawah).          Pencarian lengkap dari direktori di PATH dilakukan hanya jika          perintah tidak ditemukan di tabel hash.

Meskipun hash biasanya mempercepat operasi shell, ada satu kasus yang menyebabkan masalah. Jika Anda memperbarui sistem Anda dan, akibatnya, beberapa gerakan yang dapat dieksekusi ke lokasi baru, cangkangnya mungkin menjadi bingung. Solusinya adalah lari hash -r yang menyebabkan shell melupakan semua lokasi berciri dan mencari PATH dari awal.

Mengapa beberapa executable hilang dari hash?

Eksekusi tidak ditempatkan di hash sampai setelah Anda mengeksekusi setidaknya sekali. Mengamati:

$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)

python di-hash hanya setelah dieksekusi.

Bagaimana cara memeriksa apa yang ada dalam hash bash

Isi hash tersedia di bash larik BASH_CMDS. Anda dapat melihat apa yang ada di dalamnya dengan perintah declare -p BASH_CMDS. Ketika shell atau subkulit baru dibuka, hash kosong. Perintah ditambahkan satu per satu saat digunakan. Dari cangkang yang baru saja dibuka, amati:

$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'

32
2018-04-11 18:57



+1, penjelasan yang cukup bagus. Tapi kenapa untuk which dan bukan untuk python? - jobin
@Jobin Lihat jawaban yang diperbarui. - John1024
Sepertinya hash tetap hanya sampai waktu kita tidak keluar dari shell. Setelah kita me-restart terminal, itu tidak mengatakan bahwa perintah tersebut di-hash. - Aditya
@Aditya Ya. Saya menambahkan bagian tentang itu untuk jawabannya. - John1024
hash -l akan lebih mudah digunakan daripada declare -p BASH_CMDS - phuclv