Cosa significa "rm è hash"?


58

Sto andando su http://mywiki.wooledge.org/BashGuide/CommandsAndArguments e mi sono imbattuto in questo:

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

Poco prima, la guida elencava i vari tipi di comandi compresi da Bash: alias, funzioni, builtin, parole chiave ed eseguibili. Ma non si parlava di "hash". Quindi, in questo contesto, cosa significa "hash"?

Risposte:


59

È una cosa da spettacolo; invece di cercare l'intero binario per il binario ogni volta che viene chiamato, viene inserito in una tabella hash per una ricerca più rapida. Quindi, qualsiasi binario che è già in questa tabella hash, viene hash. Se sposti i binari quando hanno già l'hash, proveranno comunque a chiamarli nella loro vecchia posizione.

Vedi anche help hash, o man bashe cerca hashsotto i comandi integrati lì.


15

Come altri hanno già detto, l'hash è un array associativo (chiave -> valore) che Bash mantiene in modo tale che quando viene eseguito un comando, Bash cerca prima questo hash per vedere se la posizione del comando sul disco è già stata trovata $PATHe memorizzata lì per una ricerca più rapida.

Puoi precaricare l'hash dando un elenco di comandi che Bash deve trovare quando viene invocato. Questa variabile è chiamata BASH_CMDS.

estratto dalla pagina 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.

Inoltre, se guardi la pagina man di Bash, c'è una sezione intitolata, ESECUZIONE DEI COMANDI che descrive in dettaglio la macchina a stati che Bash usa quando viene digitato un comando al prompt.

estratto

   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.

Puoi scoprire cosa c'è attualmente nel tuo hash usando l' -linterruttore.

Esempio

$ 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

molto utile grazie. Mentre sto lavorando a una sceneggiatura trovo che questa cosa hash si frapponga. C'è un modo per disabilitare o cancellare questo?
qodeninja,

10

hash è una shell Bash integrata che fornisce hashing per i comandi.

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

Direttamente dalla bocca del cavallo:

help hash

Ricorda o visualizza le posizioni dei programmi.

info Bash → Comandi Shell incorporati → Bourne Shell Builtins

Ricorda i percorsi completi dei comandi specificati come argomenti NAME, quindi non è necessario cercarli nelle invocazioni successive. I comandi si trovano cercando nelle directory elencate in $PATH. L' -popzione inibisce la ricerca del percorso e FILENAME viene utilizzato come posizione di NAME. L' -ropzione fa sì che la shell dimentichi tutte le posizioni memorizzate. L' -dopzione fa sì che la shell dimentichi la posizione memorizzata di ciascun NOME. Se -tviene fornita l' opzione, viene stampato il percorso completo a cui corrisponde ogni NOME. Se vengono forniti più argomenti NAME con -tNAME viene stampato prima del percorso completo con hash. L' -lopzione consente di visualizzare l'output in un formato che può essere riutilizzato come input. Se non viene fornito alcun argomento o se solo-lviene fornito, vengono stampate le informazioni sui comandi ricordati. Lo stato di restituzione è zero a meno che non venga trovato NAME o venga fornita un'opzione non valida.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.