hash
adalah perintah built-in bash. Tabel hash adalah fitur bash
yang mencegahnya dari harus mencari $PATH
setiap kali Anda mengetik perintah dengan menyimpan hasilnya di memori. Tabel akan dihapus pada acara yang jelas-jelas membatalkan hasil (seperti memodifikasi $PATH
)
The hash
perintah hanya bagaimana Anda berinteraksi dengan sistem yang (untuk mana alasan Anda merasa Anda perlu).
Beberapa kasus penggunaan:
Seperti Anda melihatnya mencetak berapa kali Anda menekan perintah mana jika Anda mengetiknya tanpa argumen. Ini mungkin memberi tahu Anda perintah mana yang paling sering Anda gunakan.
Anda juga dapat menggunakannya untuk mengingat file yang dapat dieksekusi di lokasi yang tidak standar.
Contoh:
[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you're thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#
Yang mungkin berguna jika Anda hanya memiliki satu executable di direktori di luar $PATH
yang ingin Anda jalankan dengan cukup ketik nama daripada memasukkan semua yang ada di direktori itu (yang akan menjadi efek jika Anda menambahkannya ke $PATH
).
Alias biasanya dapat melakukan ini juga, meskipun dan karena Anda memodifikasi perilaku shell saat ini, itu tidak dipetakan dalam program yang Anda mulai. Symlink ke executable tunggal mungkin merupakan opsi yang lebih disukai di sini. hash
adalah salah satu cara untuk melakukannya.
- Anda dapat menggunakannya untuk menghapus lintasan file. Ini berguna jika sebuah executable baru muncul di
PATH
direktori sebelumnya atau pergi mv
ke tempat lain dan Anda ingin memaksa bash untuk keluar dan menemukannya lagi, bukan tempat terakhir yang ia ingat menemukannya.
Contoh:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif newDIT.ldif notes.txt users.ldif
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /lol-wut/ls
[root@policyServer ~]#
The cp
perintah menyebabkan versi baru dari ls
eksekusi muncul di awal saya $PATH
tetapi tidak memicu pembersihan dari tabel hash. Saya digunakan hash -d
untuk membersihkan entri secara selektif ls
dari tabel hash. Bash kemudian dipaksa untuk melihat $PATH
lagi dan ketika itu terjadi, ia menemukannya di lokasi yang lebih baru (lebih awal dalam $ PATH daripada yang berjalan sebelumnya).
Anda dapat secara selektif menjalankan $PATH
perilaku "cari lokasi yang dapat dieksekusi dari " ini, meskipun:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
Anda sebagian besar hanya ingin melakukan ini jika Anda menginginkan sesuatu dari tabel hash dan tidak 100% Anda bisa logout dan kemudian berhasil kembali, atau Anda ingin mempertahankan beberapa modifikasi yang telah Anda buat pada shell Anda.
Untuk menghilangkan pemetaan basi, Anda juga dapat melakukan hash -r
(atau export PATH=$PATH
) yang secara efektif hanya membersihkan seluruh tabel hash bash.
Ada banyak situasi kecil seperti itu. Saya tidak tahu apakah saya akan menyebutnya salah satu dari perintah "paling berguna" tetapi memiliki beberapa kasus penggunaan.
hash
perintah secara internal menggunakan tabel hash untuk menyimpan pemetaan. en.wikipedia.org/wiki/Hash_tablehash
tidakbash
spesifik, perintah berasal dari shell Bourne di SVR2 (meskipun fitur hashing paths dari perintah berasal daricsh
sebelumnya) dan ditemukan di semua shell Bourne-like dan POSIX.export PATH=$PATH
membersihkan meja,hash -r
harus cukup.hash -r
atau Anda akan mendapatkan versi yang lama karena $ PATH tidak berubah sehingga Bash tidak menyadari bahwa ia dapat memuat program yang sama dari direktori sebelumnya (prioritas yang lebih tinggi). Lihat conda.pydata.org/docs/… untuk detailnya.Inilah penggunaan klasik, disederhanakan:
sumber
hash hello
.setopt -s checkhash
dan hash yang dapat dieksekusi untuk perintah sudah tidak ada, entri hash untuk perintah itu akan diperbarui. Tetapi perhatikan bahwa setiap sesi bash memiliki tabel hash sendiri, jadi menutup sesi dan memulai yang baru secara efektif mengosongkan hash. (hash -r
adalah cara yang lebih mudah untuk melakukan itu.)$PATH
, atau meluncurkan terminal bash baru, keduanya tampak membersihkan meja.Inilah penggunaan yang bermanfaat
hash
:Artinya: jika php tidak ada dalam PATH, maka gunakan
sumber
Ya, Manual Referensi Bash mengatakan:
Tetapi Anda dapat menonaktifkan hashing dengan
set +h
:Mencoba:
Hal yang sama juga berlaku untuk
hash -r
,hash NAME
dll"Deteksi perintah" (seperti ini atau itu ) tidak berfungsi:
Anda dapat menulis sesuatu seperti ini:
atau (terima kasih kepada @mikeserv) tanpa harus menetapkan variabel baru atau melakukan tes apa pun:
sumber
old_options
hal Anda - saya biasanya melakukan sesuatu seperti ini:set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"
jadi semuanya jatuh ke tempatnya secara otomatis tanpa harus menetapkan variabel baru atau melakukan tes atau apa pun.Deteksi mudah apakah perintah tersedia:
sumber