Bash se souvient du mauvais chemin vers un exécutable qui a été déplacé / supprimé

29

Quand je fais

which pip3

Je reçois

/usr/local/bin/pip3

mais lorsque j'essaie d'exécuter, pip3j'obtiens une erreur comme suit:

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

C'est parce que j'ai récemment supprimé ce fichier. Maintenant, la whichcommande pointe vers une autre version de pip3celle-ci, /usr/local/binmais le shell se souvient toujours du mauvais chemin. Comment puis-je lui faire oublier ce chemin?

Le whichmanuel dit

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.

Les deux /usr/local/binet /usr/binsont dans ma PATHvariable, et ce /usr/local/bin/pip3n'est pas un lien symbolique, c'est un exécutable. Alors pourquoi ne s'exécute-t-il pas?

araignée
la source
Quel est le contenu de /usr/local/bin/pip3?
Thomas
Aviez-vous déjà couru pip3dans cet obus alors qu'il était dedans /usr/binet l' aviez ensuite déplacé?
Eric Renouf
1
Que voyez-vous si vous courez hash -t pip3?
Eric Renouf
1
@Eric Renouf hash -t pip3imprime/usr/bin/pip3
spiderface
2
Sauf si vous avez une très bonne raison, vous devez toujours utiliser du typecuir which. typeest intégré dans un shell posix et vous indique ce que fera un shell, plutôt que celui whichqui essaie de deviner ce que fera le shell.
icarus

Réponses:

37

Lorsque vous exécutez une commande, bashelle se souviendra de l'emplacement de cet exécutable, de sorte qu'il n'a pas besoin de la rechercher PATHà chaque fois. Donc, si vous exécutez l'exécutable, puis changez l'emplacement, bashessayez toujours d'utiliser l'ancien emplacement. Vous devriez être en mesure de confirmer cela avec hash -t pip3qui montrera l'ancien emplacement.

Si vous l'exécutez, hash -d pip3il dira à bash d'oublier l'ancien emplacement et devrait en trouver un nouveau la prochaine fois que vous essayerez.

Eric Renouf
la source
4
Ou hash -rpour effacer toute la table.
mattdm
Oui, ça a marché. Je pense que je vais changer le titre de la question car cela n'a rien à voir which.
spiderface
1
@spiderface pour la plupart des fonctionnalités bash, il est plus facile à utiliser helpqu'à la place de man, alors voicihelp hash
Eric Renouf
3
@spiderface type hashvous dira que c'est un shell intégré, donc il n'a pas sa propre page de manuel. Utilisez plutôt help hashou recherchez hashdans la page de manuel de bash.
deltab
1
Ou, si vous voulez vraiment utiliser man... comme hashc'est un bashbuiltin, vous voudrez man bashle trouver. Mais ce que dit la page de manuel, c'est essentiellement ce que help hashbash dit.
MAP