¿Qué significa "rm hash"?

58

Estoy pasando por http://mywiki.wooledge.org/BashGuide/CommandsAndArguments y me encontré con esto:

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

Un poco antes, la guía enumeró los diversos tipos de comandos que entiende Bash: alias, funciones, incorporados, palabras clave y ejecutables. Pero no hubo mención de "hash". Entonces, en este contexto, ¿qué significa "hash"?

Gilles 'SO- deja de ser malvado'
fuente

Respuestas:

59

Es una cosa de rendimiento; en lugar de buscar la ruta completa para el binario cada vez que se llama, se coloca en una tabla hash para una búsqueda más rápida. Por lo tanto, cualquier binario que ya esté en esta tabla hash se convierte en hash. Si mueve los archivos binarios cuando ya están en hash, aún intentará llamarlos en su ubicación anterior.

Vea también help hash, o man bashy busque hashdebajo de los comandos incorporados allí.

Frostschutz
fuente
15

Como otros han mencionado, el hash es una matriz asociativa (clave -> valor) que Bash mantiene para que cuando se ejecute un comando, Bash busque este hash primero para ver si la ubicación del comando en el disco ya se ha encontrado a través de $PATH, y almacenada allí para una búsqueda más rápida

Puede precargar el hash dando una lista de comandos que desea que Bash encuentre cuando se invoca. Esta variable se llama BASH_CMDS.

extracto de la 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.

Además, si observa la página de manual de Bash, hay una sección titulada, EJECUCIÓN DE MANDO , que detalla la máquina de estado que Bash usa cuando se escribe un comando en el indicador.

extracto

   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.

Puede averiguar qué hay actualmente en su hash usando el -linterruptor.

Ejemplo

$ 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
slm
fuente
Muy útil gracias. Mientras estoy trabajando en un guión, encuentro que esta cuestión de hash se interpone en el camino. ¿Hay alguna forma de desactivar o borrar esto?
qodeninja
10

hash es un shell Bash integrado que proporciona hashing para comandos.

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

Directo de la boca del caballo:

help hash

Recuerde o muestre las ubicaciones de los programas.

info Bash → Comandos de Shell Builtin → Bourne Shell Builtins

Recuerde los nombres de ruta completos de los comandos especificados como argumentos NAME, por lo que no es necesario buscarlos en invocaciones posteriores. Los comandos se encuentran buscando en los directorios listados en $PATH. La -popción inhibe la búsqueda de ruta, y FILENAME se usa como la ubicación de NAME. La -ropción hace que el shell olvide todas las ubicaciones recordadas. La -dopción hace que el shell olvide la ubicación recordada de cada NOMBRE. Si -tse proporciona la opción, se imprime el nombre de ruta completo al que corresponde cada NOMBRE. Si se suministran varios argumentos NAME, -tel NAME se imprime antes del nombre de ruta completo hash. La -lopción hace que la salida se muestre en un formato que puede reutilizarse como entrada. Si no se dan argumentos, o si solo-lse suministra, se imprime información sobre los comandos recordados. El estado de devolución es cero a menos que no se encuentre un NOMBRE o se proporcione una opción no válida.

Ruban Savvy
fuente