실행하면 hash
마지막으로 해시가 재설정된 이후 실행된 모든 명령의 경로가 표시됩니다( hash -r
).
[root@c04c ~]# hash
hash: hash table empty
[root@c04c ~]# whoami
root
[root@c04c ~]# hash
hits command
1 /usr/bin/whoami
[root@c04c ~]# whoami
root
[root@c04c ~]# hash
hits command
2 /usr/bin/whoami
매뉴얼 페이지에 따르면 해싱의 목적은 다음과 같습니다.
/usr/bin/hash 유틸리티는 현재 쉘 환경이 발견된 유틸리티의 위치를 기억하는 방법에 영향을 줍니다. 지정된 인수에 따라 유틸리티 위치를 기억된 위치 목록에 추가하거나 목록의 내용을 지웁니다. 인수가 지정되지 않으면 목록의 내용을 보고합니다. 이
-r
옵션을 사용하면 쉘이 기억된 모든 위치를 잊어버립니다.쉘에 내장된 유틸리티는 해시를 통해 보고되지 않습니다.
명령을 몇 번이나 입력했는지 보는 것 외에는 실용성이 보이지 않습니다 hash
.
thegeekstuff.com에도 소개되어 있습니다.가장 유용한 15가지 명령
어떤 면에서 hash
유용합니까?
답변1
hash
bash에 내장된 명령입니다. 해시 테이블의 기능 중 하나는 결과를 메모리에 캐시하여 명령을 입력할 때마다 검색할 필요를 bash
없애는 것입니다 . $PATH
결과를 명확하게 무효화하는 이벤트(예: 수정)의 경우 $PATH
테이블이 지워집니다.
명령은 hash
시스템과 상호 작용하는 방식입니다(필요하다고 생각하는 이유가 무엇이든).
일부 사용 사례:
보시다시피 인수 없이 명령을 입력하면 어떤 명령을 클릭했는지 횟수가 출력됩니다. 이를 통해 가장 자주 사용하는 명령이 무엇인지 알 수 있습니다.
또한 이를 사용하여 비표준 위치에 있는 실행 파일을 기억할 수도 있습니다.
예:
[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you’re thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#
실행하려는 디렉토리가 아닌 디렉토리에만 실행 파일이 있는 경우 $PATH
해당 디렉토리의 모든 항목을 포함하는 대신 이름만 입력하면 $PATH
유용할 수 있습니다 ( 에 추가하는 경우).
별칭은 일반적으로 동일한 작업을 수행하지만 현재 셸의 동작을 수정하므로 시작하는 프로그램에 매핑되지 않습니다. 여기서는 별도의 실행 파일에 대한 심볼릭 링크를 선택하는 것이 더 나을 수 있습니다. hash
방법이다.
- 이를 사용하여 파일 경로를 잊어버릴 수 있습니다. 이는 새로운 실행 파일이 이전 디렉터리에 나타나
PATH
거나 다른 곳으로 옮겨졌을 때mv
, bash가 그것을 찾았던 마지막 위치 대신 다시 찾도록 하려는 경우에 유용합니다.
예:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif newDIT.ldif notes.txt users.ldif
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /lol-wut/ls
[root@policyServer ~]#
이 명령을 사용하면 이전 버전에 cp
실행 파일의 새 버전이 표시되었지만 해시 테이블 정리가 실행되지는 않았습니다. 한때 해시 테이블에서 항목을 선택적으로 제거한 적이 있습니다. 그런 다음 Bash는 강제로 다시 찾아야 하며 , 그렇게 하면 더 새로운 위치(이전 실행보다 $PATH 더 빠른 위치)에서 찾습니다.ls
$PATH
hash -d
ls
$PATH
그러나 선택적으로 "실행 파일의 새 위치 찾기" $PATH
동작을 호출할 수 있습니다.
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
해시 테이블에서 무언가를 가져오려고 하는데 100% 로그아웃했다가 성공적으로 돌아올 수 없거나 셸에 대한 일부 수정 사항을 보존하려는 경우에만 이 작업을 수행합니다.
오래된 매핑을 제거하려면 bash의 전체 해시 테이블을 효과적으로 지우는 hash -r
(또는 ) 작업을 수행할 수도 있습니다.export PATH=$PATH
이와 같은 작은 상황이 많이 있습니다. 이 명령을 "가장 유용한" 명령 중 하나로 부를 수 있을지는 모르겠지만 몇 가지 사용 사례가 있습니다.
답변2
단순화된 클래식 사용법은 다음과 같습니다.
# My PATH contains /home/rici/bin as well as the Usual Suspects:
# (the real one has lots more)
$ echo $PATH
/home/rici/bin:/usr/local/bin:/usr/bin:/bin
# I've installed a program called hello in /usr/local/bin
$ $ cat /usr/local/bin/hello
#!/bin/bash
echo Hello, world. I live at $0
# The program works.
$ hello
Hello, world. I live at /usr/local/bin/hello
# Now I want to create a better hello, just for me. I put it in
# my own bin directory, and according to my PATH, it should come first.
$ cp /usr/local/bin/hello ~/bin/hello
# So now I will try running it
$ hello
Hello, world. I live at /usr/local/bin/hello
# WTF? Oh, forgot to run hash.
# Tell bash to update where to look for hello
$ hash hello
$ hello
Hello, world. I live at /home/rici/bin/hello
# Ah, all is well.
답변3
유용한 사용법은 다음과 같습니다 hash
.
hash php 2> /dev/null || hash -p /usr/local/foobar/php/bin/php php 2> /dev/null
즉, PHP가 PATH에 없으면 다음을 사용하십시오.
/usr/local/foobar/php/bin/
답변4
명령이 사용 가능한지 쉽게 감지합니다.
CMD=gzip
if hash bzip2; then
CMD=$_
fi