it-swarm-id.com

Bagaimana cara menghapus cache path Bash ke executable?

Ketika saya menjalankan program tanpa menentukan path lengkap ke executable, dan Bash harus mencari direktori di $PATH untuk menemukan biner, tampaknya Bash mengingat path dalam semacam cache. Sebagai contoh, saya menginstal build Subversion dari sumber ke /usr/local, lalu mengetik svnsync help di Bash Prompt. Bash menemukan biner /usr/local/bin/svnsync untuk "svnsync" dan dieksekusi. Lalu ketika saya menghapus instalasi Subversion di /usr/local dan berlari kembali svnsync help, Bash merespons:

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

Tetapi, ketika saya memulai instance baru dari Bash, ia menemukan dan mengeksekusi /usr/bin/svnsync.

Bagaimana cara menghapus cache path ke executable?

276
Daniel Trebbien

bash melakukan cache path lengkap ke sebuah perintah. Anda dapat memverifikasi bahwa perintah yang Anda coba jalankan hash dengan perintah type:

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

Untuk menghapus seluruh cache:

$ hash -r

Atau hanya satu entri:

$ hash -d svnsync

Untuk informasi tambahan, lihat help hash dan man bash.

349
Tobu

Untuk menghapus hanya satu entri, Anda memerlukan bendera yang berbeda:

hash -d svnsync

-r flag tidak mengambil parameter dan akan selalu menghapus seluruh cache.
(Setidaknya dalam bash 3.2.39 tentang Debian Lenny)

27

Ada solusi yang tidak disebutkan di sini.

  1. Anda dapat menonaktifkan hashing dengan set +h atau set +o hashall

    help set mengatakan:

    -h - Ingat lokasi perintah ketika mereka dicari untuk dieksekusi. Ini diaktifkan secara default.

    hashall - Sama seperti -h

    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. Anda dapat memeriksa bahwa perintah yang ditemukan di tabel hash ada sebelum mencoba untuk mengeksekusinya dengan shopt -s checkhash

    help shopt mengatakan:

    checkhash - Jika diatur, bash memeriksa apakah ada perintah yang ditemukan di tabel hash sebelum mencoba untuk mengeksekusinya. Jika perintah hash tidak ada lagi, pencarian jalur normal dilakukan.

    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. Anda dapat mengikat NAME dengan PATH dengan hash -p PATH NAME atau 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" melakukan hash -r

    Dari variables.c :

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

    Mencoba:

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

Sebagai pengguna johntex telah mencatat dalam komentar ke jawaban oleh pengguna Tob , tindakan praktis paling sederhana di Bash adalah hanya mengulangi program Anda:

hash svnsync

Itu saja.

5
Acumenus