Que veut dire «rm is hashed»?

58

Je vais sur http://mywiki.wooledge.org/BashGuide/CommandsAndArguments et suis tombé sur ceci:

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

Un peu plus tôt, le guide répertoriait les différents types de commandes comprises par Bash: alias, fonctions, fonctions intégrées, mots-clés et exécutables. Mais il n'a pas été question de "haché". Alors, dans ce contexte, que veut dire "haché"?

Gilles, arrête de faire le mal
la source

Réponses:

59

C'est une chose de performance; au lieu de rechercher le binaire dans son intégralité à chaque appel, il est placé dans une table de hachage pour une recherche plus rapide. Ainsi, tout binaire qui se trouve déjà dans cette table de hachage est haché. Si vous déplacez des fichiers binaires alors qu'ils sont déjà hachés, il essaiera toujours de les appeler à leur ancien emplacement.

Voir aussi help hash, ou man bashet rechercher les hashcommandes sous intégrées.

Frostschutz
la source
15

Comme d'autres l'ont mentionné, le hachage est un tableau associatif (clé -> valeur) que Bash maintient afin que lorsqu'une commande est exécutée, Bash le recherche en premier pour voir si l'emplacement de la commande sur le disque a déjà été trouvé via $PATH, et y est stocké. pour une recherche plus rapide.

Vous pouvez précharger le hachage en donnant une liste des commandes que vous souhaitez que Bash trouve quand il est appelé. Cette variable s'appelle BASH_CMDS.

extrait de la page de manuel

   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.

De plus, si vous consultez la page de manuel Bash, une section intitulée COMMAND EXECUTION détaille la machine à états utilisée par Bash lorsqu’une commande est saisie à l’invite.

extrait

   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.

Vous pouvez trouver ce qui se trouve actuellement dans votre hachage en utilisant le -lcommutateur.

Exemple

$ 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
la source
très utile merci. Pendant que je travaille sur un script, je découvre que le hash est un obstacle. Y a-t-il un moyen de désactiver ou d'effacer ceci?
Qodeninja
10

hash est un shell Bash intégré qui fournit un hachage des commandes.

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

Tout droit de la bouche du cheval:

help hash

Rappelez-vous ou affichez les emplacements du programme.

info Bash → Commandes intégrées à Shell → Bourne Shell à intégrer

Rappelez-vous les noms de chemin d'accès complets des commandes spécifiées en tant qu'arguments NAME. Par conséquent, il n'est pas nécessaire de les rechercher lors des appels suivants. Les commandes sont trouvées en cherchant dans les répertoires listés dans $PATH. L' -poption inhibe la recherche de chemin et FILENAME est utilisé comme emplacement de NAME. Cette -roption fait en sorte que le shell oublie tous les emplacements mémorisés. L' -doption fait que le shell oublie l'emplacement mémorisé de chaque NOM. Si l' -toption est fournie, le chemin complet auquel chaque NOM correspond est imprimé. Si plusieurs arguments NAME sont fournis avec, -tNAME est imprimé avant le nom de chemin complet haché. Cette -loption permet d'afficher la sortie dans un format pouvant être réutilisé en tant qu'entrée. Si aucun argument n'est donné, ou si seulement-lest fourni, les informations sur les commandes mémorisées sont imprimées. Le statut de retour est zéro sauf si un nom est introuvable ou si une option non valide est fournie.

Ruban Savvy
la source