символическая ссылка указывает на правильный двоичный файл, но выполняется другой?

символическая ссылка указывает на правильный двоичный файл, но выполняется другой?

Я немного запутался, как это возможно. Я установил новую версию Python, удалил старые символические ссылки и заменил их новыми. Но по какой-то причине старый двоичный файл все еще вызывается?

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

Кто-нибудь может объяснить такое поведение? Может я что-то не так сделал?

решение1

Я предлагаю использовать command -vвместо which. Вы можете узнать больше о причинах этогов этом вопросе/ответе по Unix SE. Короткая версия: whichэто нестандартный инструмент давно минувших времен. command -vэто встроенная оболочка и стандарт POSIX. В оболочках Bourne следует использовать typeили command -v.

Как вы уже заметили, псевдонимы — это один из возможных случаев, который можно обнаружить только с помощью встроенной функции оболочки, например:

$ 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

В вашем случае, похоже, что pythonбыл псевдоним python3. Есть много мест, где псевдоним может быть определен.

решение2

Вы установили python один раз в одном месте. Затем вы изменили символическую ссылку на другое место.

Я думаю, что вы столкнулись с оптимизацией bash, позволяющей не искать $PATH каждый раз при вводе команды, а кэшируя результаты в памяти.

Хэш пути — это хэш-таблица, поддерживаемая bash, которая содержит местоположения на диске, где оболочка должна искать исполняемые программы при запуске команды. Хэш-таблица очищается при событиях, которые явно делают результаты недействительными (например, изменение $PATH), или с помощью встроенного хэш команда.

Когда вы снова запустили python, bash просто попытался получить его оттуда, где он его нашел в прошлый раз, и получил старую версию.

Чтобы сделать хеш недействительным для Python, выполните одну из следующих команд:

hash python
hash -r

Связанный контент