Bash pamięta złą ścieżkę do pliku wykonywalnego, który został przeniesiony / usunięty

29

Kiedy robię

which pip3

dostaję

/usr/local/bin/pip3

ale gdy próbuję wykonać pip3, pojawia się następujący błąd:

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

To dlatego, że niedawno usunąłem ten plik. Teraz whichpolecenie wskazuje, że inna wersja tego pip3pliku znajduje się w, /usr/local/binale powłoka nadal pamięta złą ścieżkę. Jak mogę zapomnieć o tej ścieżce?

whichInstrukcja mówi

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.

Zarówno /usr/local/bini /usr/binsą w moim PATHzmiennej, a /usr/local/bin/pip3nie jest dowiązaniem symbolicznym, to plik wykonywalny. Dlaczego więc się nie wykonuje?

pająk
źródło
Jaka jest treść /usr/local/bin/pip3?
Thomas
Czy wcześniej biegałeś pip3w tej powłoce, gdy była w /usr/binśrodku, a następnie ją przenosiłeś?
Eric Renouf,
1
Co widzisz, jeśli biegniesz hash -t pip3?
Eric Renouf,
1
@Eric Renouf hash -t pip3drukuje/usr/bin/pip3
pająk
2
O ile nie masz bardzo dobrego powodu, zawsze powinieneś używać typeeather niż which. typejest wbudowany w powłokę posix i mówi ci, co zrobi powłoka, a nie whichktóry próbuje zgadnąć, co zrobi powłoka.
icarus

Odpowiedzi:

37

Kiedy uruchomisz polecenie bash, zapamięta lokalizację tego pliku wykonywalnego, więc nie będzie musiał za PATHkażdym razem szukać ponownie. Więc jeśli uruchomisz plik wykonywalny, a następnie zmień lokalizację, bashnadal spróbujesz użyć starej lokalizacji. Powinieneś być w stanie to potwierdzić, za pomocą hash -t pip3którego wyświetli się stara lokalizacja.

Jeśli uruchomisz hash -d pip3, powiesz bashowi, aby zapomniał o starej lokalizacji i powinien znaleźć nową przy następnej próbie.

Eric Renouf
źródło
4
Lub hash -rwyczyścić cały stół.
mattdm
Tak, zadziałało. Myślę, że zmienię tytuł pytania, ponieważ nie ma ono nic wspólnego which.
pająk
1
@spiderface dla większości funkcji bash jest łatwiejszy w użyciu helpzamiast człowieka, więc tutajhelp hash
Eric Renouf
3
@spiderface type hashpowie ci, że jest to wbudowana powłoka, więc nie ma własnej strony podręcznika . Zamiast tego użyj help hashlub wyszukaj hashna stronie podręcznika bash.
deltab
1
Lub, jeśli naprawdę chcesz używać man... ponieważ hashjest to bashwbudowany, powinieneś man bashgo znaleźć. Ale to, co mówi strona podręcznika, to w zasadzie to, co help hashmówi bash.
MAP