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.