해시 명령의 목적은 무엇입니까?

해시 명령의 목적은 무엇입니까?

실행하면 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

hashbash에 내장된 명령입니다. 해시 테이블의 기능 중 하나는 결과를 메모리에 캐시하여 명령을 입력할 때마다 검색할 필요를 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$PATHhash -dls$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

관련 정보