![¿El enlace simbólico apunta al binario correcto, pero aún se ejecuta otro?](https://rvso.com/image/1665749/%C2%BFEl%20enlace%20simb%C3%B3lico%20apunta%20al%20binario%20correcto%2C%20pero%20a%C3%BAn%20se%20ejecuta%20otro%3F.png)
Estoy un poco confundido sobre cómo esto es posible. Instalé una nueva versión de Python, eliminé los enlaces simbólicos antiguos y los reemplacé por los nuevos. Sin embargo, por alguna razón, ¿todavía se llama al antiguo binario?
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
¿Alguien que pueda explicar este comportamiento? ¿Hay algo que hice mal?
Respuesta1
Sugiero usar command -v
en lugar de which
. Puede encontrar más información sobre las razones detrás de esto.en esta sesión de preguntas y respuestas de Unix SE. La versión corta: which
es una herramienta no estándar de tiempos pasados. command -v
es un shell integrado y un estándar POSIX. En shells Bourne, debes usar type
o command -v
.
Como ya ha descubierto, los alias son un caso posible que sólo se puede detectar con un shell incorporado, por ejemplo:
$ 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
En su caso, parece que python
tenía el alias de python3
. Hay muchos lugares donde se podría definir el alias.
Respuesta2
Ha instalado Python una vez en un solo lugar. Luego cambiaste el enlace simbólico a otra ubicación.
Creo que te has topado con una optimización de bash para no tener que buscar $PATH cada vez que escribes un comando, almacenando en caché los resultados en la memoria.
El hash de ruta es una tabla hash, mantenida por bash, que contiene las ubicaciones en el disco donde el shell debe buscar programas ejecutables cuando se ejecuta un comando. La tabla hash se borra en eventos que obviamente invalidan los resultados (como la modificación de $PATH), o mediante el uso de la función incorporada picadillo dominio.
Cuando ejecutó Python nuevamente, bash simplemente intentó obtenerlo desde donde lo encontró la última vez, lo que le proporcionó la versión anterior.
Para invalidar el hash de Python, ejecute uno de los siguientes comandos:
hash python
hash -r