왜`type which`가`hashed`라고 말하는가?


31

쉘 내장 (예 : type자체)의 경우 :

$ type type
type is a shell builtin

$ which type
<Doesn't return anything since it's a shell builtin, silently exits>

명령 (일반적으로)의 경우 (예 :) python:

$ type python
python is /usr/bin/python

$ which python
/usr/bin/python

의 경우 which(에 위치한 명령 /usr/bin/which)

$ type which
which is hashed (/usr/bin/which)
$ which which
/usr/bin/which

왜 그렇게 type whichwhich is hashed합니까? which해시되는 의미는 무엇이며 실제로 의미하는 것은 무엇입니까?

답변:


40

긴 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" )'

+1, 꽤 좋은 설명입니다. 그러나 왜 which그렇지 python않은가?
jobin

@Jobin 업데이트 된 답변을 참조하십시오.
John1024

2
셸을 종료하지 않을 때까지 해시가 지속되는 것처럼 보입니다. 터미널을 다시 시작하면 명령이 해시되었다고 말하지 않습니다.
Aditya

1
@Aditya 예. 답변에 섹션을 추가했습니다.
John1024

hash -l보다 더 사용하기 쉬울 것입니다declare -p BASH_CMDS
phuclv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.