hash(1) hash(1)
NAME
hash - Hash-Tabelle der Shell bearbeiten
SYNTAX
hash [name ...] Format 1
hash -r Format 2
BESCHREIBUNG
Das in die Bourne-Shell sh(1) eingebaute Kommando hash hat zwei Funk-
tionen:
- Es schreibt den Inhalt der Hash-Tabelle auf die Standardausgabe
oder trägt das angegebene Kommando in die Hash-Tabelle ein (Format
1).
- Es löscht den Inhalt der Hash-Tabelle (Format 2).
Jede Shell hat ihre eigene Hash-Tabelle, in die sie alle Kommandos
einträgt, die mit ihrem einfachen Dateinamen aufgerufen wurden. Wenn
Sie ein Kommando mit dem einfachen Dateinamen aufrufen, sucht die
Shell dieses Kommando zuerst in der Hash-Tabelle. Dadurch beschleunigt
sich der Suchvorgang [siehe sh(1)]. Steht dieses Kommando noch nicht
in der Hash-Tabelle der aktuellen Shell, wird es neu eingetragen.
Wenn Sie eine Subshell starten, ist die Hash-Tabelle der neuen Shell
noch leer. Wenn Sie die Subshell beenden, meldet sich die übergeord-
nete Shell mit ihrer Hash-Tabelle zurück. Die Hash-Tabelle der Sub-
shell ist gelöscht.
In der Korn-Shell ksh(1) ist hash eine Alias-Variable für alias -t -,
wobei alias(1) ein eingebautes Korn-Shell-Kommando ist.
Format 1: Hash-Tabelle ausgeben oder erweitern
hash [name ...]
name Einfacher Dateiname eines Kommandos, einer ausführbaren Shell-
Prozedur oder eines ausführbaren Programms. Die Shell sucht
diese Datei entsprechend dem Inhalt der Variablen PATH. Wenn die
Shell die Datei gefunden hat, übergibt sie an hash:
- den entsprechenden relativen Pfadnamen der Form ./name, wenn
das aktuelle Verzeichnis der Variablen PATH zugewiesen ist
und name enthält, oder
- den absoluten Pfadnamen.
Das Kommando hash trägt diesen Pfadnamen in die Hash-Tabelle
ein. Ist name in keinem Verzeichnis enthalten, das der Variablen
PATH zugewiesen ist, so erhalten Sie eine Fehlermeldung.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
hash(1) hash(1)
Für name können Sie nicht angeben:
- Shell-Prozeduren, für die Sie kein Ausführrecht haben,
- Kommandos, deren name einen Schrägstrich / enthält. Sie kön-
nen also keine absoluten oder relativen Pfadnamen angeben.
- eingebaute Shell-Kommandos, da sie Unterprogramme von sh bzw.
ksh sind. Ihr Name ist also nicht der Name einer ausführbaren
Datei.
Die Shell trägt ebenfalls nur ausführbare Shell-Prozeduren und
Kommandos ein, wenn Sie sie mit ihrem einfachen Dateinamen auf-
rufen.
name nicht angegeben:
Das Kommando hash schreibt den Inhalt der Hash-Tabelle auf die
Standardausgabe. Die Ausgabe sieht wie folgt aus:
hits cost command
1 1 /bin/mail
1 2 /usr/bin/tar
1 1 /bin/ls
1 1 /bin/cat
1 1 /bin/chmod
Dabei bedeuten die Angaben in den einzelnen Spalten:
hits Wie oft die Shell dieses Kommando seit dem Eintrag in
die Tabelle bereits ausgeführt hat. Die Ziffer 0 kenn-
zeichnet Kommandos, die bisher nur eingetragen, aber
noch nicht ausgeführt wurden.
Ein Stern * direkt nach der Zahl kennzeichnet ausführ-
bare Dateien, die nicht in den Standardverzeichnissen
für PATH, also in /bin bzw. /usr/bin enthalten sind.
cost Beim wievielten Pfadnamen in der Variablen PATH die
Shell das angegebene Kommando gefunden hat.
command Absoluter Pfadname der ausführbaren Datei bzw. ein
Pfadname der Form ./name für eine Datei im aktuellen
Verzeichnis.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
hash(1) hash(1)
Format 2: Hash-Tabelle löschen
hash -r
-r Den Inhalt der Hash-Tabelle löschen.
Wenn Sie den Wert der Variablen PATH ändern, wird der Inhalt der
Hash-Tabelle automatisch gelöscht.
Wenn Sie die aktuelle Shell beenden, ist auch die Hash-Tabelle
als Bestandteil dieser Shell gelöscht.
Sie sollten den Inhalt der Hash-Tabelle in der aktuellen Shell
löschen, wenn folgender Fall eingetreten ist:
Sie haben eine ausführbare Datei in einem Verzeichnis erstellt,
dessen Pfadname der Variablen PATH zugewiesen ist. Ein anderes
Verzeichnis, dessen Pfadname ebenfalls der Variablen PATH zuge-
wiesen ist, enthält bereits eine Kommandodatei gleichen Namens,
die in der aktuellen Hash-Tabelle eingetragen ist. Dann führt
die Shell immer das ältere Kommando aus, auch wenn in der Varia-
blen PATH das zugehörige Verzeichnis hinter dem zuerst genannten
eingetragen ist.
Wenn Sie die Hash-Tabelle mit hash -r löschen, wird beim näch-
sten Aufruf das Kommando gestartet, das die Shell zuerst findet.
In diesem Fall entscheidet also die Reihenfolge der Einträge in
der Variablen PATH. Der Pfadname des zuerst gefundenen Kommandos
wird in die Hash-Tabelle eingetragen; d. h. dieses Kommando wird
ab jetzt immer ausgeführt, wenn Sie es mit seinem einfachen
Dateinamen aufrufen.
FEHLERMELDUNG
name: not found
Diese Fehlermeldung kann eine der folgenden Ursachen haben:
- name ist in keinem der Verzeichnisse enthalten, deren Pfad der
Variablen PATH zugewiesen ist.
- name ist zwar in einem dieser Verzeichnisse enthalten, aber nicht
ausführbar.
- name ist ein eingebautes Shell-Kommando oder eine Shell-Funktion.
INTERNATIONALE UMGEBUNG
Die Umgebungsvariable LCMESSAGES bestimmt die Sprache der Meldungs-
texte. Wenn LCMESSAGES nicht oder als leere Zeichenkette definiert
ist, wird der Wert von LANG als Standardwert herangezogen. Ist auch
LANG nicht oder als leere Zeichenkette definiert, verhält sich das
System so, als wäre es nicht internationalisiert.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
hash(1) hash(1)
BEISPIELE
Beispiel 1
Den Inhalt der Hash-Tabelle ausgeben:
$ echo $PATH
/bin:/usr/bin:.
$ hash
hits cost command
1 1 /bin/mail
1 2 /usr/bin/tar
2 1 /bin/ls
3 1 /bin/cat
1* 3 ./stich
1 1 /bin/uname
Beispiel 2
Ein Kommando in die Hash-Tabelle eintragen:
$ hash lpr
$ hash
hits cost command
.
.
0 1 /bin/lpr
.
.
Das Kommando /bin/lpr wurde neu in die Hash-Tabelle eingetragen. Es
wurde noch nicht ausgeführt, und die Shell hat es in dem Verzeichnis
gefunden, dessen Pfadname in der Variablen PATH an erster Stelle
steht.
Beispiel 3
Der folgende Bildschirm-Dialog soll zeigen, wann die Hash-Tabelle
gelöscht wird:
$ hash
hits cost command
1 1 /bin/mail
1 2 /usr/bin/tar
2 1 /bin/ls
3 1 /bin/cat
0 1 /bin/lpr
1* 3 ./stich
1 1 /bin/uname
$ sh
$ hash
hits cost command
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
hash(1) hash(1)
$ who
...
$ ls
...
$ hash
hits cost command
1 1 /bin/who
1 1 /bin/ls
$ CTRL-D
$ hash
hits cost command
1 1 /bin/mail
1 2 /usr/bin/tar
2 1 /bin/ls
3 1 /bin/cat
0 1 /bin/lpr
1* 3 ./stich
1 1 /bin/uname
1 1 /bin/sh
In der neu gestarteten Subshell ist die Hash-Tabelle leer. Wenn die
Subshell beendet wird, gilt wieder die Hash-Tabelle der übergeordneten
Shell. Die Hash-Tabelle der Subshell ist gelöscht.
UMGEBUNGSVARIABLEN
PATH Suchpfad der Shell
HINWEISE
hash existiert sowohl als externes Kommando (/usr/bin/hash) als auch
als eingebautes Shell-Kommando (Built-in) der Bourne-Shell sh(1). Für
die Ausführung von /usr/bin/hash erzeugt die Shell einen neuen Prozeß.
Bei der Verwendung von hash können sich Abweichungen im Verhalten
ergeben, je nachdem, welches Kommando benutzt wird. Die möglichen
Abweichungen sind nicht eigens beschrieben.
SIEHE AUCH
alias(1), sh(1).
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98