warum verwendet die Shell die ausführbare Datei in /usr/bin und nicht in /usr/local/bin

warum verwendet die Shell die ausführbare Datei in /usr/bin und nicht in /usr/local/bin

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/cmakebeim 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 cmakewurde es wie erwartet interpretiert.

Antwort2

Zu einem früheren Zeitpunkt während derselben Shell-Sitzung haben Sie verwendet cmakeund diese ausführbare Datei wurde in gefunden /usr/bin.

Anschließend haben Sie eine weitere cmakeausführbare Datei in installiert /usr/local/bin.

Die bashShell 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 $PATHdem ursprünglichen Speicherort liegt.

Die Lösung für dieses Problem besteht darin, die zwischengespeicherten Speicherorte der ausführbaren Dateien zu leeren, die bashbeibehalten werden. Dies geschieht mit hash -r( rehashin der zshShell). Um nur den Speicherort der cmakeausführbaren Datei zu vergessen, verwenden Sie hash -d cmake( unhash cmakein der zshShell).


In einer früheren Version dieser Frage wurde zusätzlich gefragt, warum die beiden Befehle type cmakeund which cmakeunterschiedliche Ergebnisse lieferten, wobei scheinbar das erwartete Ergebnis ( ) which cmakegeliefert wurde, während scheinbar das falsche Ergebnis () geliefert wurde ./usr/local/bin/cmaketype cmake/usr/bin/cmake

Die Antwort darauf ist, dass es typesich um einen integrierten Befehl handelt, bashder dieselben zwischengespeicherten Befehlsspeicherorte verwendet, die die Shell verwendet, und whichzwarnichtein 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 whichnach gesucht wurde . Tatsächlich war es jedoch dascmake$PATHfalschErgebnis, da die Ausführung cmakeauf der Kommandozeile tatsächlichnichtabholen /usr/local/bin(aufgrund des Caching, von dem whichich nichts wüsste).

Eine Zusammenfassung der Geschichte von whichund der Fallstricke bei seiner Verwendung finden Sie hier:Warum nicht „welches“ verwenden? Was soll man dann verwenden?

verwandte Informationen