심볼릭 링크는 올바른 바이너리를 가리키지만 또 다른 바이너리가 실행됩니까?

심볼릭 링크는 올바른 바이너리를 가리키지만 또 다른 바이너리가 실행됩니까?

이것이 어떻게 가능한지 약간 혼란 스럽습니다. 새 버전의 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 Q/A에서. 짧은 버전: 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을 한 곳에 한 번 설치했습니다. 그런 다음 심볼릭 링크를 다른 위치로 변경했습니다.

나는 당신이 명령을 입력할 때마다 $PATH를 검색할 필요가 없도록 결과를 메모리에 캐시함으로써 bash를 최적화했다고 생각합니다.

경로 해시는 명령이 실행될 때 쉘이 실행 가능한 프로그램을 찾아야 하는 디스크의 위치를 ​​포함하는 bash에 의해 유지 관리되는 해시 테이블입니다. 해시 테이블은 결과를 명백히 무효화하는 이벤트(예: $PATH 수정)에서 지워지거나 내장된 해시시 명령.

Python을 다시 실행했을 때 bash는 지난번에 찾은 위치에서 그것을 가져오려고 시도했으며 이로 인해 이전 버전이 제공되었습니다.

Python의 해시를 무효화하려면 다음 명령 중 하나를 실행하십시오.

hash python
hash -r

관련 정보