Was bedeutet "rm is hashed"?

58

Ich habe http://mywiki.wooledge.org/BashGuide/CommandsAndArguments durchgesehen und bin auf Folgendes gestoßen :

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

Nur ein wenig früher listete die Anleitung die verschiedenen Arten von Befehlen auf, die von Bash verstanden werden: Aliase, Funktionen, Builtins, Schlüsselwörter und ausführbare Dateien. Von "hashed" wurde aber nicht gesprochen. Was bedeutet "gehasht" in diesem Zusammenhang?

Gilles 'SO - hör auf böse zu sein'
quelle

Antworten:

59

Es ist eine Leistungssache; Anstatt bei jedem Aufruf den gesamten Pfad nach der Binärdatei zu durchsuchen, wird sie zur schnelleren Suche in eine Hash-Tabelle gestellt. Alle Binärdateien, die bereits in dieser Hash-Tabelle enthalten sind, werden gehasht. Wenn Sie Binärdateien verschieben, während sie bereits gehasht sind, wird weiterhin versucht, sie an ihrem alten Speicherort aufzurufen.

Siehe auch help hash, oder man bashund suche dort hashunter eingebauten Befehlen.

Frostschutz
quelle
15

Wie andere bereits erwähnt haben, handelt es sich bei dem Hash um ein assoziatives Array (Schlüssel -> Wert), das von Bash verwaltet wird. Wenn ein Befehl ausgeführt wird, durchsucht Bash diesen Hash zuerst, um festzustellen $PATH, ob der Speicherort des Befehls auf der Festplatte bereits über gefunden und dort gespeichert wurde für eine schnellere Suche.

Sie können den Hash vorab laden, indem Sie eine Liste von Befehlen angeben, nach denen Bash beim Aufrufen suchen soll. Diese Variable wird aufgerufen BASH_CMDS.

Auszug aus der Manpage

   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.

Wenn Sie sich die Bash- Manpage ansehen, gibt es außerdem einen Abschnitt mit dem Titel COMMAND EXECUTION, in dem die Zustandsmaschine aufgeführt ist, die Bash verwendet, wenn ein Befehl an der Eingabeaufforderung eingegeben wird.

Auszug

   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.

Mit dem -lSchalter können Sie herausfinden, was sich aktuell in Ihrem Hash befindet .

Beispiel

$ 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
quelle
sehr hilfreich danke. Während ich an einem Skript arbeite, stört mich dieses Hash-Ding. Gibt es eine Möglichkeit, dies zu deaktivieren oder zu löschen?
Qodeninja
10

hash ist eine eingebaute Bash-Shell, die Hashing für Befehle bereitstellt.

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

Direkt aus dem Maul des Pferdes:

help hash

Programmstandorte merken oder anzeigen.

info Bash → Shell Builtin-Befehle → Bourne Shell Builtins

Denken Sie an die vollständigen Pfadnamen von Befehlen, die als NAME-Argumente angegeben wurden, damit bei nachfolgenden Aufrufen nicht nach ihnen gesucht werden muss. Die Befehle werden durch Durchsuchen der in aufgeführten Verzeichnisse gefunden $PATH. Die -pOption sperrt die Pfadsuche und FILENAME wird als Speicherort von NAME verwendet. Die -rOption bewirkt, dass die Shell alle gespeicherten Positionen vergisst. Die -dOption bewirkt, dass die Shell den gespeicherten Speicherort jedes NAMENS vergisst. Wenn die -tOption angegeben ist, wird der vollständige Pfadname gedruckt, dem jeder NAME entspricht. Wenn mehrere NAME-Argumente zusammen mit -tdem NAME angegeben werden, wird dieser vor dem gehashten vollständigen Pfadnamen gedruckt. Die -lOption bewirkt, dass die Ausgabe in einem Format angezeigt wird, das als Eingabe wiederverwendet werden kann. Wenn keine Argumente angegeben werden oder wenn nur-lgeliefert wird, werden Informationen zu gespeicherten Befehlen gedruckt. Der Rückgabestatus ist Null, es sei denn, ein NAME wurde nicht gefunden oder eine ungültige Option wurde angegeben.

Ruban Savvy
quelle