Bash'ın yoldaki yürütülebilir dosya önbelleğini devre dışı bırak


12

Bunun bir kopya olmadığını unutmayın . Ben yaklaşık soruyorum devre dışı temizleyerek değil, önbellek. Temizlenecek bir önbelleğiniz varsa, açıkça devre dışı bırakılmaz.

Bash'ın yolda bulduğu şeylerin önbelleğini fark ettiğim nadir durumlarda, yararlı olduğu için değil, kanlı sinir bozucu olduğu için değil. Bir örnek:

~ 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

Başka bir kabukta ...

~ dc$ which which
/usr/bin/which

Eminim ki bu önbellekleme, disklerin yavaş olduğu ve hafızanın pahalı ve sınırlı olduğu eski günlerde mantıklıydı ve bu yüzden çok fazla önbellek kullanamadınız - bir yolu önbelleğe almak, bir komut bulmak için gerekli tüm disk bloklarını önbelleğe almaktan daha ucuzdur . Ancak bu günlerde fark edilir bir fayda sağlamaz ve çözdüğünden daha fazla soruna neden olur. Bu bir yanlışlık, bir böcek olma eşiğinde.

Ve bunu devre dışı bırakmanın bir yolunu bile bulamıyorum. İşaretçi var mı?


1
/usr/binTamamen önbellekte kalan çok fazla RAM'iniz yoksa, bir masaüstü makinesinin genel durumunda bile avantajlar fark edilir .
Gilles 'SO- kötü olmayı bırak'

1
@ drhyde, üzgünüm. Bu soruyu yinelenen olarak işaretledim. set +hKarma işlemini devre dışı bırakmak için kullanın .
Evgeny Vereshchagin

Nixos'ta karma içindeki karmaşayı devre dışı bıraktı. Sanırım Nixos'un çalışma şekli yüzünden iyi bir sebep. Ancak, bunun Nixos için gerçekten zorunlu olup olmadığından emin değilim. Sadece diyorum ki, bash içindeki bir hash belirli durumlarda problemler getirebilir.
tipolojik

Yanıtlar:


12

Sorgu çizilmeden önce karma yürütülebilir dosyaları silebilirsiniz:

PROMPT_COMMAND='hash -r'

Gönderen 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.

1
bkz Cevabımı hakkındaset +h
Evgeny Vereshchagin

1
@EvgenyVereshchagin set +h, ideal değildir, birçok kamu (örn yakut mücevher tesisatları) araması olarak hash, akımları üreten -bash: hash: hashing disableduyarıları.
David Moles

Aynı uyarı mesajlarını bir python virtualenv aktivasyonunda da görüyorum. Ama bence, zararsız.
tipolojik

8

Artık karma tablosunda bir komut yoksa bash'ı yeni bir yol araması yapmaya zorlayabilirsiniz.

shopt -s checkhash

Bash'ın sayfasından:

checkhash

    Sette ise bash komut çiftler tablosunda çekleri o kadar çalıştırmak denemeden önce mevcut. Bir karma komutu artık yoksa, normal bir yol araması yapılır.

Misal:

[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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.