
Gegeben:
/usr/local/bin/cmake
/usr/bin/cmake
$ cmake # runs /usr/bin/cmake
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Warum ist das so und wie bringe ich die Shell dazu, die ausführbare Datei /usr/local/bin/cmake
beim Eintippen auszuführen cmake
(ohne Aliase und dergleichen)?
Antwort1
Das Problem wurde durch Ausführen von
$ type -f cmake
cmake is hashed (/usr/bin/cmake)
Und das Löschen des Bash-Hashes mit
hash -d cmake
Danach cmake
wurde es wie erwartet interpretiert.
Antwort2
Zu einem früheren Zeitpunkt während derselben Shell-Sitzung haben Sie verwendet cmake
und diese ausführbare Datei wurde in gefunden /usr/bin
.
Anschließend haben Sie eine weitere cmake
ausführbare Datei in installiert /usr/local/bin
.
Die bash
Shell speichert den ersten Speicherort, den sie für jeden externen Befehl findet, den Sie verwenden, zwischen. Das bedeutet, dass sie beim nächsten Mal, wenn Sie denselben Befehl verwenden, keine aufwändige Suche nach der ausführbaren Datei durchführen muss. Der Nachteil dabei ist, dass sie sich nicht die Mühe macht, nachwiederwenn Sie später eine andere ausführbare Datei mit demselben Namen installieren, selbst wenn dies in einem Verzeichnis erfolgt, das vor $PATH
dem ursprünglichen Speicherort liegt.
Die Lösung für dieses Problem besteht darin, die zwischengespeicherten Speicherorte der ausführbaren Dateien zu leeren, die bash
beibehalten werden. Dies geschieht mit hash -r
( rehash
in der zsh
Shell). Um nur den Speicherort der cmake
ausführbaren Datei zu vergessen, verwenden Sie hash -d cmake
( unhash cmake
in der zsh
Shell).
In einer früheren Version dieser Frage wurde zusätzlich gefragt, warum die beiden Befehle type cmake
und which cmake
unterschiedliche Ergebnisse lieferten, wobei scheinbar das erwartete Ergebnis ( ) which cmake
geliefert wurde, während scheinbar das falsche Ergebnis () geliefert wurde ./usr/local/bin/cmake
type cmake
/usr/bin/cmake
Die Antwort darauf ist, dass es type
sich um einen integrierten Befehl handelt, bash
der dieselben zwischengespeicherten Befehlsspeicherorte verwendet, die die Shell verwendet, und which
zwarnichtein integrierter Befehl und kann daher die zwischengespeicherten Speicherorte der ausführbaren Dateien nicht verwenden.
In diesem Fall hat das erwartete Ergebnis geliefert, da in Ihrem which
nach gesucht wurde . Tatsächlich war es jedoch dascmake
$PATH
falschErgebnis, da die Ausführung cmake
auf der Kommandozeile tatsächlichnichtabholen /usr/local/bin
(aufgrund des Caching, von dem which
ich nichts wüsste).
Eine Zusammenfassung der Geschichte von which
und der Fallstricke bei seiner Verwendung finden Sie hier:Warum nicht „welches“ verwenden? Was soll man dann verwenden?