Когда я выполняю программу без указания полного пути к исполняемому файлу, и 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
.
Как очистить кэш путей к исполняемым файлам?
bash
executable
cache
Даниэль Треббиен
источник
источник
Ответы:
bash
кэширует полный путь к команде. Вы можете проверить, что команда, которую вы пытаетесь выполнить, хешируется с помощьюtype
команды:Чтобы очистить весь кэш:
Или только одна запись:
За дополнительной информацией обращайтесь
help hash
иman bash
.источник
csh
, командаrehash
.rehash
команда также работает дляzsh
.hash svnsync
.Чтобы очистить только одну запись, вам нужен другой флаг:
-r
Флаг не принимает параметр и всегда будет удалять весь кэш.(По крайней мере, в bash 3.2.39 на Debian Lenny)
источник
Есть решения, не упомянутые здесь.
Вы можете отключить хеширование с помощью
set +h
илиset +o hashall
help set
говорит:Вы можете проверить, что команда, найденная в хеш-таблице, существует, прежде чем пытаться выполнить ее с
shopt -s checkhash
help shopt
говорит:Вы можете связать NAME с PATH с помощью
hash -p PATH NAME
илиBASH_CMDS[NAME]=PATH
:Магия:
PATH="$PATH"
выполняетhash -r
От
variables.c
:Пытаться:
источник
Как отметил пользователь johntex в комментарии к ответу пользователя Tobu , самое простое практическое действие в Bash - перефразировать только вашу программу:
Вот и все.
источник