O que significa "rm hash"?

52

Estou passando pelo link e me deparei com isso:

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

Apenas um pouco antes, o guia listou os vários tipos de comandos compreendidos pelo Bash: aliases, funções, builtins, palavras-chave e executáveis. Mas não houve menção de "hashed". Então, nesse contexto, o que "hash" significa?

    
por Gilles 19.12.2013 / 13:18

3 respostas

53

É uma coisa de desempenho; em vez de pesquisar todo o caminho para o binário toda vez que ele é chamado, ele é colocado em uma tabela de hash para uma pesquisa mais rápida. Portanto, qualquer binário que já esteja nessa tabela de hash está com hash. Se você mover binários quando eles já estiverem com hash, ele ainda tentará chamá-los no local antigo.

Veja também help hash , ou man bash e procure por hash sob comandos internos.

    
por 19.12.2013 / 13:25
13

Como outros já mencionaram, o hash é um array associativo (chave - > valor) que o Bash mantém para que, quando um comando é executado, o Bash busque este hash primeiro para ver se a localização do comando no disco já foi encontrada via $PATH e armazenados lá para uma pesquisa mais rápida.

Você pode pré-carregar o hash fornecendo uma lista de comandos que você deseja que o Bash encontre quando for invocado. Esta variável é chamada BASH_CMDS .

trecho da página man

   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.

Além disso, se você olhar a página do manual do Bash, há uma seção intitulada EXECUÇÃO DO COMANDO , que detalha a máquina de estado usada pelo Bash quando um comando é digitado no prompt.

trecho

   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.

Você pode descobrir o que está no seu hash usando a opção -l .

Exemplo

$ 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
    
por 19.12.2013 / 13:41
5
hash [-lr] [-p filename] [-dt] [name]

For each name, the full file name of the command is determined by searching the directories in $PATH and remembered. If the -p option is supplied, no path search is performed, and filename is used as the full file name of the command. The -r option causes the shell to forget all remembered locations. The -d option causes the shell to forget the remembered location of each name. If the -t option is supplied, the full pathname to which each name corresponds is printed. If multiple name arguments are supplied with -t, the name is printed before the hashed full pathname. The -l option causes output to be displayed in a format that may be reused as input. If no arguments are given, or if only -l is supplied, information about remembered commands is printed. The return status is true unless a name is not found or an invalid option is supplied.

Direto da boca do cavalo .. Atribuição help hash

    
por 19.12.2013 / 13:28