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 Ренуф 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.
павук

1
@spiderface для більшості баш-функцій легше використовувати helpзамість людини, тому тутhelp hash
Ерік Реноф

3
@spiderface type hashскаже вам, що це вбудована оболонка, тому у неї немає власної сторінки. Замість цього використовуйте help hashабо шукайте hashсторінку чоловіка bash.
дельтаб

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