Как я очищаю кэш Bash путей к исполняемым файлам?

Для мелочей, что Вы хотите произойти, если команда оболочки работает, можно использовать && конструкция:

rm -rf somedir && trace_output "Removed the directory"

Так же для мелочей, что Вы хотите произойти, когда команда оболочки перестала работать, можно использовать ||:

rm -rf somedir || exit_on_error "Failed to remove the directory"

Или оба

rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"

Вероятно, неблагоразумно сделать очень много с этими конструкциями, но они могут при случае сделать поток из управления намного более ясным.

268
10.01.2011, 17:42
4 ответа

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

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

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

$ hash -r

Или всего одна запись:

$ hash -d svnsync

Для получения дополнительной информации консультироваться help hash и man bash.

335
27.01.2020, 19:26
  • 1
    @Daniel стоит добавить, что в ударе можно использовать команду "команда типа" для обнаружения, какая команда это - если команда хешируется, "тип", скажет Вам. Также полезно сказать, является ли что-то встроенной оболочкой или псевдоним. –  lunchmeat317 11.05.2011, 23:59
  • 2
    Как к вашему сведению, для изменения кэшируемого ПУТИ при выполнении csh, команда rehash. $lastPartGenome.sam кошки 'код' –  kurtm 12.10.2013, 03:21
  • 3
    rehash управляйте также работает на zsh. –  Neil Traft 10.11.2013, 23:35
  • 4
    В одной команде выборочное перефразирование может быть вызвано hash svnsync. –  Ioannis Filippidis 09.08.2014, 03:44
  • 5
    я обнаружил, что работал dash вместо bash - для dash hash -d не работает; hash svnsync работы для обоих как бы то ни было. –  Iiridayn 19.07.2016, 03:10

Для очистки всего одной записи, Вам нужен другой флаг:

hash -d svnsync

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

26
27.01.2020, 19:26

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

hash svnsync

Вот и все.

5
27.01.2020, 19:26

Есть решения, не упомянутые здесь.

  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 
    date # normal вывод даты 
     
  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 # включить проверку существования команды 
    date # нормальный вывод даты 
    hash -t date # prints / bin / date 
     
  3. Вы можете связать NAME с PATH с помощью hash -p ИМЯ ПУТИ или BASH_CMDS [NAME] = PATH :

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

    From variables.c :

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

    Попробуйте:

     set -h 
    hash -r 
    date 
    hash # печатает 1 / bin / date 
    PATH = "$ PATH" 
    hash # выводит hash: hash table empty 
     
23
27.01.2020, 19:26

Теги

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