Nonaktifkan cache dari executable bash di path

12

Perhatikan bahwa ini bukan duplikat. Saya bertanya tentang menonaktifkan cache, tidak membersihkannya. Jika Anda memiliki cache untuk dihapus, maka itu jelas tidak dinonaktifkan.

Pada kesempatan yang jarang saya perhatikan cache bash dari hal-hal yang telah ditemukan di jalan, itu bukan karena itu membantu, itu karena itu sangat menjengkelkan. Sebuah contoh:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

Di shell lain ...

~ dc$ which which
/usr/bin/which

Saya yakin bahwa caching ini masuk akal di masa lalu yang bagus ketika disk lambat dan memori mahal dan terbatas sehingga Anda tidak bisa men-cache banyak - cache jalan lebih murah daripada cache semua blok disk yang diperlukan untuk menemukan perintah . Tapi hari ini itu tidak memberikan manfaat nyata dan menyebabkan lebih banyak masalah daripada memecahkannya. Ini adalah kesalahan, hampir menjadi bug.

Dan saya bahkan tidak dapat menemukan cara untuk menonaktifkannya. Ada petunjuk?

DrHyde
sumber
1
Manfaatnya terlihat bahkan dalam kasus umum mesin desktop, jika Anda tidak memiliki begitu banyak RAM yang /usr/bintetap sepenuhnya dalam cache.
Gilles 'SANGAT berhenti menjadi jahat'
1
@drhyde, maaf. Saya menandai pertanyaan ini sebagai duplikat. Gunakan set +huntuk menonaktifkan hashing.
Evgeny Vereshchagin
Di Nixos, ia menonaktifkan hash di bash-nya. Saya pikir, untuk alasan yang baik karena cara kerja Nixos. Namun, saya tidak yakin apakah ini benar-benar wajib untuk Nixos. Saya hanya mengatakan, bahwa hash dalam bash dapat membawa masalah dalam situasi tertentu.
typelogic

Jawaban:

12

Anda bisa menghapus executable hash sebelum prompt ditarik:

PROMPT_COMMAND='hash -r'

Dari help hash:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.
Chris Down
sumber
1
lihat jawaban saya tentangset +h
Evgeny Vereshchagin
1
@EvgenyVereshchagin set +htidak ideal, karena banyak utilitas (mis. Instalasi permata ruby) memanggil hash, menghasilkan aliran -bash: hash: hashing disabledperingatan.
David Moles
Saya juga melihat pesan peringatan yang sama dalam aktivasi python virtualenv. Tapi saya pikir, itu tidak berbahaya.
typelogic
8

Anda bisa memaksa bash untuk melakukan pencarian jalur baru jika perintah di tabel hash tidak ada lagi.

shopt -s checkhash

Dari manual bash:

checkhash

    Jika diset, bash memeriksa apakah ada perintah yang ditemukan di tabel hash sebelum mencoba menjalankannya. Jika perintah hash tidak ada lagi, pencarian jalur normal dilakukan.

Contoh:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which
pengguna70408
sumber