it-swarm-tr.com

Bash'ın yürütülebilir dosyalara giden yol önbelleğini nasıl temizleyebilirim?

Yürütülebilir dosyanın tam yolunu belirtmeden bir program yürüttüğümde ve Bash $PATH ikili bulmak için, Bash bir tür önbellek yolu hatırlıyor gibi görünüyor. Örneğin, kaynağından /usr/local, ardından svnsync help Bash Komut İstemi'nde. Bash ikili /usr/local/bin/svnsync için "svnsync" ve yürüttü. Sonra /usr/local ve yeniden çalıştırıldı svnsync help, Bash yanıtlıyor:

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

Ancak, Bash'in yeni bir örneğini başlattığımda, /usr/bin/svnsync.

Yürütülebilir dosyalara giden yolların önbelleğini nasıl temizlerim?

276
Daniel Trebbien

bash bir komutun tam yolunu önbelleğe alır. Yürütmeye çalıştığınız komutun type komutuyla karma olduğunu doğrulayabilirsiniz:

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

Önbelleğin tamamını temizlemek için:

$ hash -r

Veya sadece bir giriş:

$ hash -d svnsync

Ek bilgi için help hash ve man bash.

349
Tobu

Yalnızca bir girişi silmek için farklı bir bayrağa ihtiyacınız vardır:

hash -d svnsync

-r flag bir parametre almaz ve her zaman tüm önbelleği siler.
(En azından Debian Lenny'de 3.2.39 basında)

27

Burada bahsedilmeyen çözümler var.

  1. set +h Veya set +o hashall İle karma işlemini devre dışı bırakabilirsiniz.

    help set Diyor:

    -h - Yürütme için arandıkları sırada komutların yerlerini hatırlayın. 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. shopt -s checkhash İle yürütmeyi denemeden önce, karma tabloda bulunan bir komutun mevcut olup olmadığını kontrol edebilirsiniz.

    help shopt Diyor:

    checkhash - Ayarlanmışsa, bash, yürütmeyi denemeden önce karma tablosunda bulunan bir komutun var olup olmadığını kontrol eder. Bir karma komutu artık yoksa, normal bir yol araması yapılır.

    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 adlı kişiyi hash -p PATH NAME Veya BASH_CMDS[NAME]=PATH İle PATH ile bağlayabilirsiniz:

    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", hash -r

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

Kullanıcı johntex kullanıcı tarafından yanıtı bir yorumda belirttiği gibi Tobu , Bash'teki en basit eylem sadece programınızı yeniden şekillendirmektir:

hash svnsync

Bu kadar.

5
Acumenus