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это не символическая ссылка, это исполняемый файл. Так почему же он не выполняется?

spiderface
источник
Каково содержание /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говорит Баш.
КАРТА