Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

hash - Hash-Tabelle der Shell bearbeiten

&pagelevel(4)&pagelevel

(remember or report utility locations)


Das in die POSIX-Shell sh eingebaute Kommando hash hat zwei Funktionen:

  • Es schreibt den Inhalt der Hash-Tabelle auf die Standard-Ausgabe 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. 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 übergeordnete Shell mit ihrer Hash-Tabelle zurück. Die Hash-Tabelle der Subshell ist gelöscht.


Syntax


Format 1: hash[ name...]
Format 2: hash -r



Hash-Tabelle ausgeben oder erweitern
Format 1: 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 Dateiverzeichnis 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 Dateiverzeichnis enthalten, das der Variablen PATH zugewiesen ist, so erhalten Sie eine Fehlermeldung.

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önnen also keine absoluten oder relativen Pfadnamen angeben.

  • eingebaute sh-Kommandos, da sie Unterprogramme von sh 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 aufrufen.


name nicht angegeben:
Das Kommando hash schreibt den Inhalt der Hash-Tabelle auf die Standard-Ausgabe. Die Ausgabe sieht beispielsweise wie folgt aus:


ls=/usr/bin/ls 
cat=/usr/bin/cat 
chmod=/usr/bin/chmod 


Hash-Tabelle löschen
Format 2: 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 Dateiverzeichnis erstellt, dessen Pfadnameder Variablen PATH zugewiesen ist. Ein anderes Dateiverzeichnis, dessen Pfadname ebenfalls der Variablen PATH zugewiesen ist, enthält bereits eine Kommando-Datei gleichen Namens, die in der aktuellen Hash-Tabelle eingetragen ist. Dann führt die Shell immer das ältere Kommando aus, auch wenn in der Variablen PATH das zugehörige Dateiverzeichnis hinter dem zuerst genannten eingetragen ist.

Wenn Sie die Hash-Tabelle mit hash -r löschen, wird beim nächsten 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.

Fehler

name : not found
Diese Fehlermeldung kann eine der folgenden Ursachen haben:

  • name ist in keinem der Dateiverzeichnisse enthalten, deren Pfad der Variablen PATH zugewiesen ist.

  • name ist zwar in einem dieser Dateiverzeichnisse enthalten, aber nicht ausführbar.

  • name ist ein eingebautes sh-Kommando oder eine Shell-Funktion.

Variable

PATH

Suchpfad der Shell

Internationale Umgebung

Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos hash:

LANG

Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.

LC_ALL

Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.

LC_CTYPE

Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedateien) sowie die Einteilung der Zeichen in Groß- und Kleinbuchstaben und deren Übereinstimmung.

LC_MESSAGES

Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.

NLSPATH

Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.

Beispiel 1

Den Inhalt der Hash-Tabelle ausgeben:

$ echo $PATH
/bin:/usr/bin:.

$ hash

cat=/usr/bin/cat

ls=/usr/bin/ls

Beispiel 2

Ein Kommando in die Hash-Tabelle eintragen:

$ hash cat

$ hash
cat=/usr/bin/cat

Das Kommando /usr/bin/cat wurde neu in die Hash-Tabelle eingetragen.

Beispiel 3

Der folgende Bildschirm-Dialog soll zeigen, wann die Hash-Tabelle gelöscht wird:

$ hash

cat=/usr/bin/cat

ls=/usr/bin/ls

$ sh

$ hash

$ cp <datei1> <datei2>

...

$ ls

...

$ hash

cp=/usr/bin/cp

ls=/usr/bin/ls

$ exit

$ hash

cat=/usr/bin/cat

ls=/usr/bin/ls

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.