Как очистить кэш кэша Bash от исполняемых файлов?

Когда я запускаю программу без указания полного пути к исполняемому файлу, а 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: нет такого файла или каталога

Но, когда я запускаю новый экземпляр Bash, он находит и выполняет /usr /bin /svnsync.

Как очистить кеш путей от исполняемых файлов?

219 голосов | спросил Daniel Trebbien 10 Jam1000000amMon, 10 Jan 2011 04:50:03 +030011 2011, 04:50:03

4 ответа


274

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

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

Очистить весь кеш:

$ hash -r

Или только одна запись:

$ hash -d svnsync

За дополнительной информацией обратитесь к help hash и man bash.

ответил Tobu 10 Jam1000000amMon, 10 Jan 2011 04:59:34 +030011 2011, 04:59:34
23

Чтобы очистить только одну запись, вам нужен другой флаг:

hash -d svnsync

Флаг -r не принимает параметр и всегда удаляет весь кеш.
(По крайней мере, в bash 3.2.39 на Debian Lenny)

ответил Aryeh Leib Taurog 16 MarpmWed, 16 Mar 2011 18:30:40 +03002011-03-16T18:30:40+03:0006 2011, 18:30:40
17

Здесь не упоминаются решения.

  1. Вы можете отключить хеширование с помощью set + h или set + o hashall

    help set говорит:

      

    -h - Помните расположение команд по мере их поиска на исполнение. Это включено по умолчанию.

         

    hashall - То же, что и -h

    set -h # включить хеширование
    shopt -u checkhash # отключить проверку наличия команды
    hash -p /some /nonexisting /dir /date date # дата привязки с /some /nonexisting /dir /date
    date # bash: /some /nonexisting /dir /date: Нет такого файла или каталога
    set + h
    дата # нормальная дата выхода
    
  2. Вы можете проверить, существует ли команда, найденная в хэш-таблице, перед тем, как попытаться выполнить ее с помощью shopt -s checkhash

    help shopt говорит:

      

    checkhash - если установлено, bash проверяет, существует ли команда, найденная в хэш-таблице, перед тем, как попытаться ее выполнить. Если хешированная команда больше не существует, выполняется обычное отслеживание пути.

    set -h # включить хеширование
    shopt -u checkhash # отключить проверку наличия команды
    hash -p /some /nonexisting /dir /date date # дата привязки с /some /nonexisting /dir /date
    hash -t date # prints /some /nonexisting /dir /date
    date # bash: /some /nonexisting /dir /date: Нет такого файла или каталога
    shopt -s checkhash # включить проверку наличия команды
    дата # нормальная дата выхода
    hash -t date # prints /bin /date
    
  3. Вы можете связать NAME с PATH с помощью hash -p PATH NAME или BASH_CMDS [NAME] = PATH:

    shopt -u checkhash # отключить проверку наличия команды
    hash -p /some /nonexisting /dir /date date
    date # bash: /some /nonexisting /dir /date: Нет такого файла или каталога
    BASH_CMDS [дата] = /бен /дата
    дата # нормальная дата выхода
    
  4. Магия: PATH = "$ PATH" выполняет hash -r

    Из variables.c :

    /* Что делать после изменения переменной PATH. * /
    недействительным
    sv_path (имя)
        название символа;
    {
        /* hash -r * /
        phash_flush ();
    }
    

    Try:

    set -h
    hash -r
    Дата
    hash # prints 1 /bin /date
    PATH = "$ PATH"
    hash # prints hash: hash table empty
    
ответил Evgeny Vereshchagin 27 J000000Monday15 2015, 21:26:03
3

Как пользователь johntex отметил в комментарии к answer от пользователя Тобу , простейшее практическое действие в Bash - перефразировать только вашу программу:

hash svnsync

Вот и все.

ответил A-B-B 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 26 Sep 2014 23:25:43 +0400 2014, 23:25:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132