![Symlink zeigt auf richtige Binärdatei, aber trotzdem wird eine andere ausgeführt?](https://rvso.com/image/1665749/Symlink%20zeigt%20auf%20richtige%20Bin%C3%A4rdatei%2C%20aber%20trotzdem%20wird%20eine%20andere%20ausgef%C3%BChrt%3F.png)
Ich bin etwas verwirrt, wie das möglich ist. Ich habe eine neue Version von Python installiert, die alten symbolischen Links entfernt und durch die neuen ersetzt. Aus irgendeinem Grund wird die alte Binärdatei jedoch immer noch aufgerufen?
pi@raspberrypi:/usr/local/bin$ python -V
Python 3.7.3
pi@raspberrypi:/usr/local/bin$ which python
/usr/local/bin/python
pi@raspberrypi:/usr/local/bin$ ls -l /usr/local/bin/python
lrwxrwxrwx 1 root root 24 Feb 19 17:37 /usr/local/bin/python -> /usr/local/bin/python3.9
pi@raspberrypi:/usr/local/bin$ /usr/local/bin/python -V
Python 3.9.9
pi@raspberrypi:/usr/local/bin$ readlink python
/usr/local/bin/python3.9
Kann jemand dieses Verhalten erklären? Habe ich etwas falsch gemacht?
Antwort1
Ich schlage vor, command -v
anstelle von zu verwenden which
. Weitere Informationen zu den Gründen dafür finden Sie hierin diesem Unix SE Q/A. Die Kurzfassung: which
ist ein nicht standardmäßiges Tool aus längst vergangenen Zeiten. command -v
ist ein Shell-Builtin und ein POSIX-Standard. Auf Bourne-Shells sollten Sie type
oder verwenden command -v
.
Wie Sie bereits festgestellt haben, sind Aliase ein möglicher Fall, der nur mit einem Shell-Builtin erkannt werden kann, zum Beispiel:
$ alias
alias ls='ls --color=auto'
$ type ls
ls is aliased to `ls --color=auto'
$ command -v ls
alias ls='ls --color=auto'
$ which ls
/bin/ls
In Ihrem Fall scheint es, als python
wäre der Alias auf gesetzt worden python3
. Es gibt viele Stellen, an denen der Alias definiert werden könnte.
Antwort2
Sie haben Python einmal an einem Ort installiert. Dann haben Sie den symbolischen Link an einen anderen Ort geändert.
Ich denke, Sie sind auf eine Optimierung von Bash gestoßen, die es Ihnen ermöglicht, $PATH nicht bei jeder Befehlseingabe durchsuchen zu müssen, indem die Ergebnisse im Speicher zwischengespeichert werden.
Der Pfad-Hash ist eine Hash-Tabelle, die von Bash verwaltet wird und die Speicherorte auf der Festplatte enthält, an denen die Shell nach ausführbaren Programmen suchen soll, wenn ein Befehl ausgeführt wird. Die Hash-Tabelle wird bei Ereignissen gelöscht, die die Ergebnisse offensichtlich ungültig machen (wie z. B. das Ändern von $PATH), oder durch Verwendung des integrierten Hash Befehl.
Als Sie Python erneut ausgeführt haben, hat Bash einfach versucht, es von dort abzurufen, wo es es beim letzten Mal gefunden hat, wodurch Sie die alte Version erhalten haben.
Um den Hash für Python ungültig zu machen, führen Sie einen der folgenden Befehle aus:
hash python
hash -r