"rm is hashed"는 무엇을 의미합니까?


58

http://mywiki.wooledge.org/BashGuide/CommandsAndArguments를 통해이 문제를 겪었습니다 .

$ type rm
rm is hashed (/bin/rm)
$ type cd
cd is a shell builtin

조금 전에,이 안내서에는 Bash가 이해하는 다양한 유형의 명령 (별명, 함수, 내장, 키워드 및 실행 파일)이 나열되어 있습니다. 그러나 "해시"에 대한 언급은 없었습니다. 따라서이 문맥에서 "해시"는 무엇을 의미합니까?

답변:


59

성능입니다. 바이너리가 호출 될 때마다 바이너리의 전체 경로를 검색하는 대신 빠른 조회를 위해 해시 테이블에 저장됩니다. 따라서이 해시 테이블에 이미있는 바이너리는 해시됩니다. 바이너리가 이미 해시되어있을 때 바이너리를 옮기더라도 여전히 이전 위치에서 바이너리를 호출하려고 시도합니다.

도 참조 help hash하거나 내장 명령에서 man bash검색 하십시오 hash.


15

다른 사람들이 언급했듯이 해시는 Bash가 유지하는 연관 배열 (키-> 값)이므로 명령이 실행될 때 Bash는이 해시를 먼저 검색하여 디스크의 명령 위치가 이미 발견 $PATH되어 저장되어 있는지 확인합니다. 더 빠른 검색을 위해.

Bash가 호출 될 때 찾을 명령 목록을 제공하여 해시를 미리로드 할 수 있습니다. 이 변수를라고 BASH_CMDS합니다.

매뉴얼 페이지에서 발췌

   BASH_CMDS
          An  associative  array  variable  whose members correspond to the 
          internal hash table of commands as maintained by the hash builtin.
          Elements added to this array appear in the hash table; unsetting 
          array elements cause commands to be removed from the hash table.

또한 Bash 매뉴얼 페이지를 보면 COMMAND EXECUTION 섹션 에 프롬프트가 표시 될 때 Bash가 사용하는 상태 시스템이 자세히 설명되어 있습니다.

발췌

   If the name is neither a shell function nor a builtin, and contains no 
   slashes, bash searches each element of the PATH for a directory con
   taining an executable file by that name.  Bash uses a hash table to 
   remember the full pathnames of executable files (see hash  under  SHELL
   BUILTIN COMMANDS below).  A full search of the directories in PATH is 
   performed only if the command is not found in the hash table.  If the
   search is unsuccessful, the shell searches for a defined shell function 
   named command_not_found_handle.  If that  function  exists,  it  is
   invoked  with  the  original command and the original command's arguments 
   as its arguments, and the function's exit status becomes the exit
   status of the shell.  If that function is not defined, the shell prints 
   an error message and returns an exit status of 127.

-l스위치를 사용하여 현재 해시에있는 것을 찾을 수 있습니다 .

$ hash -l
builtin hash -p /usr/bin/rm rm
builtin hash -p /usr/bin/sudo sudo
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/ls ls

매우 도움을 주셔서 감사합니다. 스크립트를 작성하는 동안이 해시가 방해가되는 것을 발견했습니다. 이것을 비활성화하거나 지우는 방법이 있습니까?
qodeninja

10

hash 명령에 해시를 제공하는 Bash 셸 내장입니다.

hash [-lr] [-p filename] [-dt] [name]

말의 입에서 똑바로 :

help hash

프로그램 위치를 기억하거나 표시하십시오.

info Bash → 쉘 내장 명령 → Bourne 쉘 내장

NAME 인수로 지정된 명령의 전체 경로 이름을 기억하므로 후속 호출에서 검색 할 필요가 없습니다. 에 나열된 디렉토리를 검색하여 명령을 찾을 수 있습니다 $PATH. 이 -p옵션은 경로 검색을 금지하고 FILENAME은 NAME의 위치로 사용됩니다. 이 -r옵션을 사용하면 쉘이 기억 된 모든 위치를 잊게됩니다. 이 -d옵션은 쉘이 각 NAME의 기억 된 위치를 잊게합니다. 경우 -t옵션이 제공되며, 각각의 이름이 해당되는 전체 경로 이름이 인쇄되어 있습니다. NAME과 함께 여러 개의 NAME 인수가 제공 -t되면 해시 된 전체 경로 이름 앞에 NAME이 인쇄됩니다. 이 -l옵션을 사용하면 출력을 입력으로 재사용 할 수있는 형식으로 표시합니다. 인수가 제공되지 않거나-l제공된 명령에 대한 정보가 인쇄됩니다. NAME을 찾을 수 없거나 유효하지 않은 옵션이 제공되지 않으면 리턴 상태는 0입니다.

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