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

<p>когда я запускаю программу без указания полного пути к исполняемому файлу, bash должен искать каталоги в <code>$path, чтобы найти двоичный файл, похоже, что bash запоминает путь в каком-то кеше. например, я установил сборку subversion из исходного кода в /usr/local, затем набрал svnsync help в bash prompt. баш нашел двоичный файл /usr/local/bin/svnsync для "svnsync" и выполнил его. затем, когда я удалил установку subversion в /usr/local и перезапущен svnsync help, баш отвечает:bash: /usr/local/bin/svnsync: no such file or directory но когда я запускаю новый экземпляр bash, он находит и выполняет /usr/bin/svnsync.как очистить кэш путей к исполняемым файлам?

bash кэширует полный путь к команде. вы можете проверить, что команда, которую вы пытаетесь выполнить, хэшируется с помощью команды type:$ type svnsync svnsync is hashed (/usr/local/bin/svnsync) </code></pre><p>чтобы очистить весь кэш:</p><pre><code>$ hash -r или только одна запись:$ hash -d svnsync </code></pre><p>за дополнительной информацией обращайтесь к <code>help hash</code> а также <code>man bash</code>.</p>

<p>чтобы очистить только одну запись, вам нужен другой флаг:</p><pre><code>hash -d svnsync </code></pre><p><code>-r</code> флаг не принимает параметр и всегда удаляет весь кеш.<br> (по крайней мере, в bash 3.2.39 на debian lenny)</p>

<p>есть решения, не упомянутые здесь.</p><ol> <li> <p>вы можете отключить хеширование с помощью <code>set +h</code> или <code>set +o hashall</code></p> <p><code>help set</code> говорит:</p> <blockquote> <p>-h - запомните расположение команд при их поиске для выполнения. это включено по умолчанию.</p> <p>hashall - такой же, как -h</p> </blockquote> <pre><code>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 </code></pre></li> <li> <p>вы можете проверить, что команда, найденная в хэш-таблице, существует, прежде чем пытаться выполнить ее с помощью <code>shopt -s checkhash</code></p> <p><code>help shopt</code> говорит:</p> <blockquote> <p>checkhash - если установлено, bash проверяет, что команда, найденная в хеш-таблице, существует, прежде чем пытаться ее выполнить. если хешированная команда больше не существует, выполняется обычный поиск пути.</p> </blockquote> <pre><code>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 </code></pre></li> <li> <p>вы можете связать name с path с помощью <code>hash -p path name</code> или <code>bash\_cmds[name]=path</code>:</p> <pre><code>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 </code></pre></li> <li> <p>магия: <code>path="$path" выполняет hash -r от <a href="http://git.savannah.gnu.org/cgit/bash.git/tree/variables.c">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 </code></pre></li> </ol>

<p>как отметил пользователь <a href="https://unix.stackexchange.com/users/43390/johntex">johntex</a> в комментарии к <a href="https://unix.stackexchange.com/a/5610/50855">answer</a> пользователем <a href="https://unix.stackexchange.com/users/2729/tobu">tob</a> , самое простое практическое действие в bash - перефразировать только вашу программу:</p><pre><code>hash svnsync </code></pre><p>это все.</p>