Hash: Unterschied zwischen den Versionen

Aus Foxwiki
Zeile 36: Zeile 36:
     1    /usr/bin/man
     1    /usr/bin/man


=== Problem mit gleichnamigen Kommandos ===
=== Gleichnamigen Kommandos ===
* Liegt eines in der Hashtabelle vor, so kann auf das andere nur über die vollständige Pfadangabe zugegriffen werden
* Liegt eines in der Hashtabelle vor, so kann auf das andere nur über die vollständige Pfadangabe zugegriffen werden
* Soll dieses "benachteiligte" Kommando nun vermehrt eingesetzt werden, ist ein Löschen der Hashtabelle mittels »-r« sinnvoll
* Soll dieses "benachteiligte" Kommando nun vermehrt eingesetzt werden, ist ein Löschen der Hashtabelle mittels »-r« sinnvoll

Version vom 28. Januar 2023, 16:22 Uhr

hash - Verwaltung der Hash-Tabelle für Kommando-Pfade

Beschreibung

Ein angegebenes Kommando muss von der Shell gesucht werden
  • Die Suche, vor allem wenn sie die Angaben aus PATH einschließt, kostet Zeit.
  • Deswegen merkt sich die Bash die Zugriffspfade zu allen externen Kommandos in einer Hashtabelle.
Hashtabelle wird zuerst konsultiert
  • Nur wenn der Pfad zu einem Kommando dort nicht erfasst wird, werden die Verzeichnispfade durchsucht
    • Es sei denn hashall ist nicht gesetzt (siehe set)
  • Beim nächsten Zugriff auf das Kommando wird man den Geschwindigkeitszuwachs spüren.

Pfad-Cache

$ hash 
  • (ohne Parameter) zeigt die Liste der gemerkten Pfade zu den Programmen an.
  • Um die Zugriffe auf Programme zu beschleunigen, verwaltet die Bash einen internen Cache der Pfade auf bereits gestartete Programme.
  • Wird ein Programm erneut gestartet, kann die zeitaufwendige Suche entlang des Pfades entfallen.
  • Bei der Gelegenheit wird auch gleich angezeigt, wie oft das Programm gestartet wurde.
  • Wer am Abend wissen will, womit er sich den ganzen Tag über beschäftigt hat, kann mit diesem Kommando zumindest Hinweise bekommen (oder er wirft einen Blick auf die .bash_history)

Verwerfen alle gespeicherten Pfade

$ hash -r

Anzeige der Hashtabelle

$ hash
hits    command
   2    /bin/ls
   1    /bin/mv
   6    /bin/sh
   8    /usr/bin/vi
   1    /bin/chmod
   3    /bin/date
   1    /usr/bin/id
   1    /usr/bin/man

Gleichnamigen Kommandos

  • Liegt eines in der Hashtabelle vor, so kann auf das andere nur über die vollständige Pfadangabe zugegriffen werden
  • Soll dieses "benachteiligte" Kommando nun vermehrt eingesetzt werden, ist ein Löschen der Hashtabelle mittels »-r« sinnvoll
$ hash -r
$ hash
hash: hash table empty

Indem »hash« mit einem oder mehreren Kommandonamen aufgerufen wird, werden diese Kommandos gesucht und in die Hashtabelle aufgenommen; sie werden jedoch nicht gestartet (sinnvoll ist dies eventuell in Startskripten).

Pfad zur Tabelle hinzufügen

Mit -p <Pfad_zum_Kommando> kann ein Pfad der Tabelle hinzugefügt werden.