Anda mungkin memiliki set PATH yang panjang dan, untuk menemukan yang dapat dieksekusi, shell perlu mencari path. Untuk menghindari proses yang memakan waktu itu setiap kali Anda ingin menjalankan suatu program, shell dapat menyimpan daftar program yang telah ditemukannya. Daftar itu disebut "hash." Ketika shell mengatakan bahwa which
hash, itu berarti bahwa ia telah melakukan pencarian PATH dan menemukan which
dan menyimpan lokasinya di hash.
man bash
menjelaskannya sebagai berikut:
Bash menggunakan tabel hash untuk mengingat nama path lengkap dari file yang dapat dieksekusi (lihat hash di bawah SHELL BUILTIN PERINTAH di bawah). Pencarian penuh direktori di PATH dilakukan hanya jika perintah tidak ditemukan di tabel hash.
Sementara hash biasanya mempercepat operasi shell, ada satu kasus di mana ia menyebabkan masalah. Jika Anda memperbarui sistem Anda dan, sebagai akibatnya, beberapa bergerak yang dapat dieksekusi ke lokasi baru, shell mungkin menjadi bingung. Solusinya adalah menjalankan hash -r
yang menyebabkan shell melupakan semua lokasi hash dan mencari PATH dari awal.
Mengapa beberapa executable hilang dari hash?
Eksekusi tidak ditempatkan dalam 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
hash hanya setelah dieksekusi.
Cara memeriksa apa yang ada di hash bash
Isi hash tersedia dalam bash
array 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 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" )'
which
dan bukan untukpython
?hash -l
akan lebih mudah digunakan daripadadeclare -p BASH_CMDS