Bash запоминает неверный путь к исполняемому файлу, который был перемещен / удален


29

Когда я делаю

which pip3

я получил

/usr/local/bin/pip3

но когда я пытаюсь выполнить, pip3я получаю ошибку следующим образом:

bash: /usr/bin/pip3: No such file or directory

Это потому, что я недавно удалил этот файл. Теперь whichкоманда указывает на другую версию, pip3которая находится в, /usr/local/binно оболочка все еще помнит неправильный путь. Как мне заставить его забыть об этом пути?

whichРуководство говорит ,

which returns the pathnames of the files (or links) which would be executed in the current environment, had its arguments been given as commands in
       a strictly POSIX-conformant shell.  It does this by searching the PATH for executable files matching the names of the arguments. It does not follow
       symbolic links.

И то /usr/local/binи другое /usr/binнаходится в моей PATHпеременной, и /usr/local/bin/pip3это не символическая ссылка, это исполняемый файл. Так почему же он не выполняется?


Каково содержание /usr/local/bin/pip3?
Томас

Вы когда-нибудь запускали pip3эту оболочку, пока она была внутри, /usr/binа затем перемещали ее?
Эрик Ренуф,

1
Что вы видите, если бежите hash -t pip3?
Эрик Ренуф,

1
@Eric Renouf hash -t pip3печатает/usr/bin/pip3
spiderface

2
Если у вас нет очень веских причин, вы всегда должны использовать typeиное, чем which. typeвстроен в оболочку posix и говорит вам, что будет делать оболочка, а не пытаться whichугадать, что будет делать оболочка.
Икар

Ответы:


37

Когда вы запустите команду, bashона запомнит местоположение этого исполняемого файла, поэтому ей не придется PATHкаждый раз искать снова. Таким образом, если вы запустите исполняемый файл, а затем измените расположение, bashвсе равно попытаетесь использовать старое расположение. Вы должны быть в состоянии подтвердить это с помощью hash -t pip3которого покажет старое местоположение.

Если вы запустите hash -d pip3его, он скажет bash забыть старое местоположение и должен найти новое при следующей попытке.


4
Или hash -rочистить всю таблицу.
Mattdm

Да, это сработало. Я думаю, что я изменю название вопроса, потому что это не имеет никакого отношения к which.
spiderface

1
@spiderface для большинства функций bash проще использовать helpвместо man, поэтому здесьhelp hash
Эрик Ренуф,

3
@spiderface type hashскажет вам, что это встроенная оболочка, поэтому у нее нет собственной страницы руководства . Вместо этого используйте help hashили посмотрите hashна справочной странице Bash.
Deltab

1
Или, если вы действительно хотите использовать man... так hashкак bashвстроенный, вы хотели man bashбы найти его. Но то, что говорит страница руководства, по сути, то, что help hashговорит Баш.
КАРТА
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.