긴 PATH 세트가 있고 실행 파일을 찾으려면 셸에서 경로를 검색해야합니다. 프로그램을 실행할 때마다 시간이 많이 걸리는 프로세스를 피하기 위해 쉘은 이미 찾은 프로그램 목록을 유지할 수 있습니다. 이 목록을 "해시"라고합니다. 쉘 which
이 해시되었다고 말하면 이미 PATH 검색을 수행 which
하고 해시에서 해당 위치를 찾아 저장 했음을 의미합니다 .
man bash
다음과 같이 설명하십시오.
Bash는 해시 테이블을 사용하여 실행 파일의 전체 경로 이름을 기억합니다 (아래 SHELL BUILTIN COMMANDS 아래의 해시 참조). PATH의 디렉토리 전체 검색은 명령이 해시 테이블에없는 경우에만 수행됩니다.
해시는 일반적으로 셸 작업의 속도를 높이지만 문제를 일으키는 경우가 있습니다. 시스템을 업데이트 한 결과 일부 실행 파일이 새 위치로 이동하면 셸이 혼동 될 수 있습니다. 해결책은 hash -r
쉘이 해시 된 모든 위치를 잊고 PATH를 처음부터 검색하게하는 실행입니다.
해시에서 일부 실행 파일이 누락 된 이유는 무엇입니까?
실행 파일은 한 번 이상 실행 한 후에 해시에 배치되지 않습니다. 관찰 :
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
$ type python
python is hashed (/usr/bin/python)
python
실행 된 후에 만 해시됩니다.
bash 's hash에 무엇이 있는지 검사하는 방법
해시의 내용은 bash
배열 에서 사용할 수 있습니다 BASH_CMDS
. 명령을 사용하여 그 내용을 볼 수 있습니다 declare -p BASH_CMDS
. 새 쉘 또는 서브 쉘이 열리면 해시가 비어 있습니다. 명령은 사용되는대로 하나씩 추가됩니다. 새로 열린 쉘에서 다음을 관찰하십시오.
$ declare -p BASH_CMDS
declare -A BASH_CMDS='()'
$ which which
/bin/which
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" )'
$ python --version
Python 2.7.3
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([which]="/bin/which" [python]="/usr/bin/python" )'
which
그렇지python
않은가?