반면:
/usr/local/bin/cmake
/usr/bin/cmake
$ cmake # runs /usr/bin/cmake
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
왜 이런 일이 발생하며, 입력할 때 (별명 등 없이) /usr/local/bin/cmake
실행 파일을 실행하도록 셸을 어떻게 얻을 수 있습니까 ?cmake
답변1
실행하여 문제를 발견했습니다.
$ type -f cmake
cmake is hashed (/usr/bin/cmake)
bash 해시를 지우고
hash -d cmake
이후에는 cmake
예상대로 해석됩니다.
답변2
동일한 셸 세션의 이전 어느 시점 cmake
에서 /usr/bin
.
cmake
그런 다음 다른 실행 파일을 설치합니다 /usr/local/bin
.
쉘은 bash
사용자가 사용하는 외부 명령에 대해 찾은 첫 번째 위치를 캐시합니다. 즉, 다음에 동일한 명령을 사용할 때 실행 파일에 대해 값비싼 검색을 수행할 필요가 없습니다. 단점은 너무 게을러서 보기가 힘드네요다시$PATH
나중에 원래 위치보다 오래된 디렉터리에 설치 하더라도 동일한 이름을 가진 다른 실행 파일을 설치할 때 .
이 문제에 대한 해결책은 bash
보관된 실행 파일의 캐시 위치를 지우는 것입니다. 이 작업은 hash -r
( 쉘 rehash
에서 ) 수행됩니다. zsh
실행 파일의 위치를 잊어버리려면 ( 셸 에서 ) cmake
을 사용하세요 .hash -d cmake
unhash cmake
zsh
이 질문의 이전 버전에서는 왜 이 두 명령이 서로 다른 결과를 type cmake
제공하는지 궁금했습니다 which cmake
. 그 중 하나는 which cmake
예상한 결과( /usr/local/bin/cmake
) 를 제공하는 것처럼 보였고 type cmake
다른 하나는 잘못된 결과( /usr/bin/cmake
)를 제공하는 것으로 보입니다.
대답은 이것이 쉘에서 사용하는 명령과 동일한 캐시 위치를 사용하는 type
내장 명령 이라는 것입니다 .bash
which
아니요내장 명령이므로 실행 파일에 대한 이러한 캐시 위치는 사용되지 않습니다.
이 경우에는 귀하의 것을 검색하기 때문에 예상한 결과를 제공 which
하지만 실제로는cmake
$PATH
잘못된결과적으로 cmake
명령줄에서 실행하면 실제로아니요/usr/local/bin
(캐싱으로 인해 알 수 없음)에서 가져옵니다 which
.
이 기능 의 역사 which
와 사용의 함정에 대한 요약은 여기에서 찾을 수 있습니다." which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?