쉘이 /usr/local/bin 대신 /usr/bin의 실행 파일을 사용하는 이유

쉘이 /usr/local/bin 대신 /usr/bin의 실행 파일을 사용하는 이유

반면:

/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 cmakeunhash cmakezsh


이 질문의 이전 버전에서는 왜 이 두 명령이 서로 다른 결과를 type cmake제공하는지 궁금했습니다 which cmake. 그 중 하나는 which cmake예상한 결과( /usr/local/bin/cmake) 를 제공하는 것처럼 보였고 type cmake다른 하나는 잘못된 결과( /usr/bin/cmake)를 제공하는 것으로 보입니다.

대답은 이것이 쉘에서 사용하는 명령과 동일한 캐시 위치를 사용하는 type내장 명령 이라는 것입니다 .bashwhich아니요내장 명령이므로 실행 파일에 대한 이러한 캐시 위치는 사용되지 않습니다.

이 경우에는 귀하의 것을 검색하기 때문에 예상한 결과를 제공 which하지만 실제로는cmake$PATH잘못된결과적으로 cmake명령줄에서 실행하면 실제로아니요/usr/local/bin(캐싱으로 인해 알 수 없음)에서 가져옵니다 which.

이 기능 의 역사 which와 사용의 함정에 대한 요약은 여기에서 찾을 수 있습니다." which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?

관련 정보