![символическая ссылка указывает на правильный двоичный файл, но выполняется другой?](https://rvso.com/image/1665749/%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB%2C%20%D0%BD%D0%BE%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B9%3F.png)
Я немного запутался, как это возможно. Я установил новую версию 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