Bash'in çalıştırılabilir yolların önbelleğini nasıl temizlerim?


256

Yürütülebilir dosyanın tam yolunu belirtmeden bir programı yürüttüğümde ve Bash $PATHikili dosyayı bulmak için dizinlerde arama yapmalı , sanırım Bash bir önbellek yolunu hatırlıyor gibi görünüyor. Örneğin, kaynaktan bir Subversion derlemesi kurdum /usr/local, sonra svnsync helpBash istemine yazdım . Bash /usr/local/bin/svnsync, "svnsync" için ikili dosyayı buldu ve çalıştırdı. Sonra Subversion kurulumunu silip /usr/localyeniden çalıştırdığımda svnsync help, Bash yanıt verir:

bash: /usr/local/bin/svnsync: No such file or directory

Ancak, yeni bir Bash örneği başlattığımda bulur ve çalıştırır /usr/bin/svnsync.

Çalıştırılabilir yolların önbelleğini nasıl temizlerim?


7
en aptalca özellik
Romeno

Yanıtlar:


322

bashtam yolu bir komuta önbelleğe alır. Çalıştırmaya çalıştığınız typekomutun şu komutla eşleştirildiğini doğrulayabilirsiniz :

$ type svnsync
svnsync is hashed (/usr/local/bin/svnsync)

Tüm önbelleği temizlemek için:

$ hash -r

Veya sadece bir giriş:

$ hash -d svnsync

Ek bilgi için, danışın help hashve man bash.


15
@Daniel Bash olarak, ne tür bir komut olduğunu bulmak için "type command " komutunu kullanabilmeniz önemlidir - komutunuz karmaysa, "type" size söyleyecektir. Ayrıca bir şeyin kabuk yerleşik mi yoksa takma isim mi olduğunu bilmek de faydalıdır.
öğle yemeği317,

4
Bir FYI olarak, çalışıyorsa önbelleğe alınmış PATH'ı değiştirmek cshiçin komuttur rehash.
kurtm

Yukarıdaki rehashkomut da bunun için çalışır zsh.
Neil Traft,


4
Bir komutta seçici yeniden düzenleme işlemi tarafından çağrılabilir hash svnsync.
Ioannis Filippidis

25

Sadece bir girişi silmek için farklı bir bayrağa ihtiyacınız var:

hash -d svnsync

-rBayrak bir parametre almaz ve her zaman tüm önbelleği silecektir.
(En azından Debian Lenny'de basılan 3.2.39)


20

Burada belirtilmeyen çözümler var.

  1. Sen ile karma devre dışı bırakabilir set +hya daset +o hashall

    help set diyor:

    -h - Yürütülmeleri için aranan komutların yerini hatırla Bu, varsayılan olarak etkindir.

    hashall - -h ile aynı

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    set +h
    date # normal date output
    
  2. Çalıştırmadan önce karma tablosunda bulunan bir komutun var olup olmadığını kontrol edebilirsiniz. shopt -s checkhash

    help shopt diyor:

    checkhash - Eğer set ise, bash bunu çalıştırmayı denemeden önce karma tablosunda bulunan bir komutun mevcut olduğunu kontrol eder. Bir karma komutu artık mevcut değilse, normal bir yol araması gerçekleştirilir.

    set -h # enable hashing
    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date # bind date with /some/nonexisting/dir/date
    hash -t date # prints /some/nonexisting/dir/date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    shopt -s checkhash # enable command existence check
    date # normal date output
    hash -t date # prints /bin/date
    
  3. NAME öğesini PATH ile hash -p PATH NAMEveya ile bağlayabilirsiniz BASH_CMDS[NAME]=PATH:

    shopt -u checkhash # disable command existence check
    hash -p /some/nonexisting/dir/date date
    date # bash: /some/nonexisting/dir/date: No such file or directory
    BASH_CMDS[date]=/bin/date
    date # normal date output
    
  4. Magic: PATH="$PATH"gerçekleştirirhash -r

    Kimden variables.c:

    /* What to do just after the PATH variable has changed. */
    void
    sv_path (name)
        char *name;
    {
        /* hash -r */
        phash_flush ();
    }
    

    Deneyin:

    set -h
    hash -r
    date
    hash # prints 1 /bin/date
    PATH="$PATH"
    hash # prints hash: hash table empty
    

1
PATH = $ PATH gayet iyi çalıştığında neden tüm ekstra mekanizmaların sağlandığını anlamadım. PATH değişirse, PATH arama önbelleğinin geçersiz olması gerekir. Mantıklı.
jrw32982

PATH, çalıştırılabilir konumların değiştiği zaman, PATH değiştiğinde önbelleğin geçersiz kılınmasıyla ele alınmayan kullanım durumu. Kabuğu, program eklemek veya kaldırmak için kullanıyorsanız, yalnızca bulduğu son yeri önbelleğe almak için bu yaygın olabilir.
Adam,

Komut karma tablosu ile uğraşmak, bir bash betiğini hata ayıklamaya çalışan birinin kafasını karıştırmak için harika bir yoldur.
Erik Aronesty,

4

Kullanıcı johntex , Tobu tarafından verilen cevaba yapılan yorumda da belirtildiği gibi, Bash'deki en basit pratik eylem, yalnızca programınızı yeniden düzenlemektir:

hash svnsync

Bu kadar.

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.