Як очистити кеш-пам'ять Баша із шляхів до виконуваного файлу?


256

Коли я виконую програму, не вказуючи повний шлях до виконуваного файлу, і Bash повинен шукати в каталогах, $PATHщоб знайти бінарний файл, здається, що Bash запам'ятовує шлях у якомусь кеші. Наприклад, я встановив збірку Subversion від джерела до /usr/local, а потім набрав svnsync helpу рядку Bash. Bash розмістив двійковий /usr/local/bin/svnsyncкод для "svnsync" і виконав його. Потім, коли я видалив установку Subversion /usr/localі повторно запустив svnsync help, Bash відповідає:

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

Але коли я запускаю новий екземпляр Bash, він знаходить і виконує /usr/bin/svnsync.

Як очистити кеш-контур шляхів до виконуваного файлу?


7
найглупша функція коли-небудь
Romeno

Відповіді:


322

bashкешує повний шлях до команди. Ви можете перевірити, що команда, яку ви намагаєтеся виконати, хеширується за допомогою typeкоманди:

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

Щоб очистити весь кеш:

$ hash -r

Або лише один запис:

$ hash -d svnsync

Для отримання додаткової інформації зверніться до help hashта man bash.


15
@Daniel Варто додати, що в bash ви можете використовувати команду "type command ", щоб дізнатися, який тип команди це - якщо ваша команда хеширована, "type" скаже вам. Також корисно розповісти, чи є вбудована оболонка або псевдонім.
обідне м’ясо317

4
Як FYI, щоб змінити кешований PATH, якщо він працює csh, команда є rehash.
kurtm

Наведена вище rehashкоманда також працює для zsh.
Ніл Трафт

Для більш повної відповіді дивіться unix.stackexchange.com/questions/86012/…
Іоаніс Філіппідіс

4
В одній команді може бути викликана селективна повторна повторна робота hash svnsync.
Іоанніс Філіппідіс

25

Щоб очистити лише один запис, вам потрібен інший прапор:

hash -d svnsync

-rПрапор не приймає параметр і завжди буде видаляти весь кеш.
(Принаймні, в басі 3.2.39 про Дебіана Ленні)


20

Тут не згадуються рішення.

  1. Ви можете відключити хешування з set +hабоset +o hashall

    help set каже:

    -h - Запам’ятайте розташування команд під час пошуку для виконання. Це ввімкнено за замовчуванням.

    хешал - Те саме, що і -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. Ви можете перевірити, чи існує команда, знайдена в хеш-таблиці, перш ніж спробувати її виконати shopt -s checkhash

    help shopt каже:

    checkhash - Якщо встановлено, bash перевіряє, чи існує команда, знайдена в хеш-таблиці, перш ніж спробувати її виконати. Якщо хешована команда більше не існує, виконується звичайний пошук шляху.

    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 з PATH за допомогою hash -p PATH NAMEабо 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. Магія: PATH="$PATH"виконуєhash -r

    Від variables.c:

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

    Спробуйте:

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

1
Я ніколи не розумів, чому весь додатковий механізм поставляється, коли PATH = $ PATH працює добре. Якщо PATH змінюється, кеш пошуку PATH повинен бути визнаний недійсним. Має сенс.
jrw32982

Випадок використання не обробляється недійсним кешем, коли PATH змінюється - це коли змінюються розташування виконуваних файлів. Це може бути звичайним, коли ви використовуєте оболонку для додавання або видалення програм, лише щоб вона кешувала останнє місце, де вона їх знайшла.
Адам

Месинг з хеш-таблицею команд - чудовий спосіб дійсно заплутати того, хто намагається налагодити баш-скрипт.
Ерік Аронесті

4

Як зазначив користувач johntex у коментарі до відповіді користувача Tobu , найпростіша практична дія в Bash - це переробити лише свою програму:

hash svnsync

Це все.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.