hash
ist ein in Bash integrierter Befehl. Die Hash-Tabelle ist eine Funktion bash
, die verhindert, dass bei $PATH
jeder Eingabe eines Befehls eine Suche durchgeführt werden muss, indem die Ergebnisse im Speicher zwischengespeichert werden. Die Tabelle wird bei Ereignissen gelöscht, die die Ergebnisse offensichtlich ungültig machen (z. B. Ändern $PATH
).
Der hash
Befehl ist nur, wie Sie mit diesem System interagieren (aus welchem Grund Sie das Gefühl haben, dass Sie es brauchen).
Einige Anwendungsfälle:
Wie Sie gesehen haben, gibt es aus, wie oft Sie welche Befehle gedrückt haben, wenn Sie es ohne Argumente eingeben. Hier erfahren Sie möglicherweise, welche Befehle Sie am häufigsten verwenden.
Sie können es auch verwenden, um ausführbare Dateien an nicht standardmäßigen Speicherorten zu speichern.
Beispiel:
[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you're thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#
Dies kann nützlich sein, wenn Sie nur eine einzige ausführbare Datei in einem Verzeichnis außerhalb des $PATH
gewünschten Verzeichnisses haben, indem Sie einfach den Namen eingeben, anstatt alles in dieses Verzeichnis aufzunehmen (was der Effekt wäre, wenn Sie es hinzufügen $PATH
).
Ein Alias kann dies normalerweise auch, und da Sie das Verhalten der aktuellen Shell ändern, wird es nicht in von Ihnen gestarteten Programmen abgebildet. Ein Symlink zur einzelnen ausführbaren Datei ist hier wahrscheinlich die bevorzugte Option. hash
ist ein Weg, es zu tun.
- Sie können es verwenden, um Dateipfade nicht mehr zu merken. Dies ist nützlich, wenn eine neue ausführbare Datei in einem früheren
PATH
Verzeichnis auftaucht oder mv
an eine andere Stelle gelangt und Sie möchten, dass Bash herauskommt und sie wieder findet, anstatt an der Stelle, an der sie sich zuletzt daran erinnert, sie zu finden.
Beispiel:
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif newDIT.ldif notes.txt users.ldif
[root@policyServer ~]# hash
hits command
1 /bin/cp
1 /lol-wut/ls
[root@policyServer ~]#
Der cp
Befehl führte dazu, dass eine neue Version der ls
ausführbaren Datei früher in my $PATH
angezeigt wurde, löschte jedoch nicht die Hash-Tabelle. Früher habe ich hash -d
den Eintrag für selektiv ls
aus der Hash-Tabelle entfernt. Bash wurde dann gezwungen, $PATH
erneut zu suchen , und als es dies tat, fand es es an der neueren Position (früher in $ PATH als zuvor ausgeführt).
Sie können dieses $PATH
Verhalten "Neuen Speicherort der ausführbaren Datei finden von " jedoch selektiv aufrufen :
[root@policyServer ~]# hash
hits command
1 /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits command
0 /lol-wut/ls
[root@policyServer ~]#
Meistens möchten Sie dies nur tun, wenn Sie möchten, dass sich etwas aus der Hash-Tabelle entfernt und nicht zu 100% abgemeldet und dann wieder erfolgreich angemeldet wird, oder wenn Sie einige Änderungen beibehalten möchten, die Sie an Ihrer Shell vorgenommen haben.
Um veraltete Zuordnungen zu entfernen, können Sie auch hash -r
(oder export PATH=$PATH
) die gesamte Hash-Tabelle von bash löschen.
Es gibt viele kleine Situationen wie diese. Ich weiß nicht, ob ich es als einen der "nützlichsten" Befehle bezeichnen würde, aber es gibt einige Anwendungsfälle.
hash
Befehl intern eine Hash-Tabelle zum Speichern der Zuordnungen verwendet. en.wikipedia.org/wiki/Hash_tablehash
nichtbash
spezifisch ist. Der Befehl hat seinen Ursprung in der Bourne-Shell in SVR2 (obwohl die Funktion der Hashing-Pfade von Befehlencsh
davor stammt ) und ist in allen Bourne-ähnlichen und POSIX-Shells zu finden.export PATH=$PATH
den Tischhash -r
abzuräumen , sollte das ausreichen.hash -r
oder Sie werden die alte Version bekommen, weil sich $ PATH nicht geändert hat und Bash nicht merkt, dass es dasselbe Programm aus einem früheren Verzeichnis (mit höherer Priorität) laden kann. Weitere Informationen finden Sie unter conda.pydata.org/docs/… .Hier ist die klassische Verwendung, vereinfacht:
quelle
hash hello
.setopt -s checkhash
die ausführbare Hash-Datei für einen Befehl nicht mehr vorhanden ist, wird der Hash-Eintrag für diesen Befehl aktualisiert. Beachten Sie jedoch, dass jede Bash-Sitzung eine eigene Hash-Tabelle hatte. Wenn Sie also die Sitzung schließen und eine neue starten, wird der Hash effektiv geleert. (hash -r
ist ein einfacher Weg, das zu tun.)$PATH
oder Starten eines neuen Bash-Terminals wird die Tabelle anscheinend gelöscht.Hier ist eine nützliche Verwendung von
hash
:Es bedeutet: Wenn PHP nicht im PATH ist, dann benutze
quelle
Ja, im Bash-Referenzhandbuch heißt es:
Sie können das Hashing jedoch deaktivieren mit
set +h
:Versuchen:
Das gleiche gilt für
hash -r
,hash NAME
etcEine "Befehlserkennung" ( so oder so ) funktioniert nicht:
Sie können so etwas schreiben:
oder (danke an @mikeserv) ohne neue Variablen zuweisen oder Tests durchführen zu müssen:
quelle
old_options
Ding - ich mache normalerweise so etwas wie das:set -h -- "-${-:--}" "$@"; hash ...; set +h "$@"
Es passt einfach alles automatisch, ohne dass Sie neue Variablen zuweisen oder Tests durchführen müssen oder was auch immer.Einfache Erkennung, ob ein Befehl verfügbar ist:
quelle