![심볼릭 링크는 올바른 바이너리를 가리키지만 또 다른 바이너리가 실행됩니까?](https://rvso.com/image/1665749/%EC%8B%AC%EB%B3%BC%EB%A6%AD%20%EB%A7%81%ED%81%AC%EB%8A%94%20%EC%98%AC%EB%B0%94%EB%A5%B8%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%EB%A5%BC%20%EA%B0%80%EB%A6%AC%ED%82%A4%EC%A7%80%EB%A7%8C%20%EB%98%90%20%EB%8B%A4%EB%A5%B8%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%EA%B0%80%20%EC%8B%A4%ED%96%89%EB%90%A9%EB%8B%88%EA%B9%8C%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 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