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

당신이 실행하는 경우 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유용합니까?



답변

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명령으로 인해 ls실행 파일 의 새 버전이 초기에 표시 $PATH되었지만 해시 테이블 제거가 트리거되지 않았습니다. 해시 테이블에서 hash -d항목을 선택적으로 제거하는 데 사용 했습니다 ls. Bash는 $PATH다시 한 번 살펴 보았고 새로운 위치에서 찾았습니다 (이전의 $ 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) 작업을 수행 할 수도 있습니다 .

그런 작은 상황이 많이 있습니다. “가장 유용한”명령 중 하나라고 부르는지 모르겠지만 일부 사용 사례가 있습니다.


답변

다음은 고전적인 사용법입니다.

# 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.


답변

유용한 사용법은 다음과 같습니다 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/


답변

예, Bash Reference Manual 은 다음과 같이 말합니다.

$ PATH의 디렉토리 전체 검색은 명령이 해시 테이블에없는 경우에만 수행됩니다.

그러나 다음을 사용하여 해싱을 비활성화 할 수 있습니다 set +h.

-h-명령을 실행할 때 찾아서 (해시) 명령을 기억합니다. 이 옵션은 기본적으로 활성화되어 있습니다.

시험:

set +h
hash # prints bash: hash: hashing disabled
echo $? # prints 1

동일입니다 hash -r, hash NAME

“명령 감지”(예 : 또는 저것 )가 작동하지 않습니다.

set -h
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2 # prints nothing

set +h
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2 # prints Please install ls

다음과 같이 작성할 수 있습니다.

old_options="$-"
set -h
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2
[[ "$old_options" =~ "h" ]] || set +h

또는 새로운 변수를 할당하거나 테스트를 할 필요없이 (@mikeserv 덕분에)

set -h -- "-${-:--}" "$@"
hash ls >/dev/null 2>&1 || echo "Please install ls" >&2
set +h "$@"


답변

명령 사용 가능 여부를 쉽게 감지 :

CMD=gzip
if hash bzip2; then
    CMD=$_
fi


답변