Wenn Sie hash
ausführen es zeigt den Pfad aller Befehle, die seit dem letzten Zurücksetzen des Hashs ausgeführt wurden (hash -r
)
[[email protected] ~]# hash
hash: hash table empty
[[email protected] ~]# whoami
root
[[email protected] ~]# hash
hits command
1 /usr/bin/whoami
[[email protected] ~]# whoami
root
[[email protected] ~]# hash
hits command
2 /usr/bin/whoami
Laut den Manpages ist der Zweck von Hash:
Das Dienstprogramm /usr/bin/hash beeinflusst, wie sich die aktuelle Shell-Umgebung
die Orte der gefundenen Dienstprogramme merkt.
Abhängig von den angegebenen Argumenten fügt es Dienstprogramm-Standorte
zu seiner Liste der gemerkten Orte hinzu oder es löscht den
Inhalt der Liste. Wenn keine Argumente angegeben werden, berichtet es
über den Inhalt der Liste. Das -r
Option bewirkt, dass
die Shell alle gespeicherten Orte vergisst.
Dienstprogramme, die in die Shell eingebaut sind, werden
nicht per Hash gemeldet.
Außer zu sehen, wie oft ich einen Befehl eingegeben habe, kann ich den Nutzen von hash
nicht sehen .
Es wurde sogar in den 15 nützlichsten Befehlen von thegeekstuff.com erwähnt
Inwiefern ist hash
nützlich?
Akzeptierte Antwort:
hash
ist ein in Bash integrierter Befehl. Die Hash-Tabelle ist ein Feature von bash
das verhindert, dass $PATH
gesucht werden muss Jedes Mal, wenn Sie einen Befehl eingeben, indem Sie die Ergebnisse im Speicher zwischenspeichern. Die Tabelle wird bei Ereignissen gelöscht, die die Ergebnisse offensichtlich ungültig machen (z. B. das Ändern von $PATH
)
Der hash
Befehl ist einfach, wie Sie mit diesem System interagieren (aus welchem Grund auch immer Sie das für nötig halten).
Einige Anwendungsfälle:
-
Wie Sie gesehen haben, gibt es aus, wie oft Sie welche Befehle gedrückt haben, wenn Sie es ohne Argumente eingeben. Dies könnte Ihnen sagen, welche Befehle Sie am häufigsten verwenden.
-
Sie können es auch verwenden, um sich ausführbare Dateien an nicht standardmäßigen Speicherorten zu merken.
Beispiel:
[[email protected] ~]# hash -p /lol-wut/whoami whoami
[[email protected] ~]# whoami
Not what you're thinking
[[email protected] ~]# which whoami
/usr/bin/whoami
[[email protected] ~]# /usr/bin/whoami
root
[[email protected] ~]#
Dies kann nützlich sein, wenn Sie nur eine einzelne ausführbare Datei in einem Verzeichnis außerhalb von $PATH
haben die Sie ausführen möchten, geben Sie einfach den Namen ein, anstatt alles in dieses Verzeichnis aufzunehmen (was der Effekt wäre, wenn Sie es zu $PATH
hinzufügen würden ).
Ein Alias kann dies normalerweise auch tun, aber da Sie das Verhalten der aktuellen Shell ändern, wird es nicht in Programmen abgebildet, die Sie starten. Ein Symlink auf die einsame ausführbare Datei ist hier wahrscheinlich die bevorzugte Option. hash
ist eine Möglichkeit, dies zu tun.
- Sie können es verwenden, um sich an Dateipfade zu erinnern. Dies ist nützlich, wenn eine neue ausführbare Datei in einem früheren
PATH
auftaucht Verzeichnis oder erhältmv
woanders hingegangen ist und Sie Bash zwingen möchten, es wieder zu finden, anstatt den letzten Ort zu finden, an dem es sich erinnert, es gefunden zu haben.
Beispiel:
[[email protected] ~]# hash
hits command
1 /bin/ls
[[email protected] ~]# cp /bin/ls /lol-wut
[[email protected] ~]# hash
hits command
1 /bin/cp
1 /bin/ls
[[email protected] ~]# hash -d ls
[[email protected] ~]# ls
default.ldif newDIT.ldif notes.txt users.ldif
[[email protected] ~]# hash
hits command
1 /bin/cp
1 /lol-wut/ls
[[email protected] ~]#
Der cp
Befehl verursachte eine neue Version des ls
ausführbar, um früher in meinem $PATH
zu erscheinen hat aber keine Bereinigung der Hash-Tabelle ausgelöst. Ich habe hash -d
verwendet um den Eintrag für ls
selektiv zu löschen aus der Hash-Tabelle. Bash war dann gezwungen, $PATH
zu durchsuchen erneut und wenn es das tat, fand es es an der neueren Stelle (früher in $PATH als es vorher lief).
Sie können dies „neuen Speicherort der ausführbaren Datei von $PATH
suchen“ selektiv aufrufen ” Verhalten, obwohl:
[[email protected] ~]# hash
hits command
1 /bin/ls
[[email protected] ~]# hash ls
[[email protected] ~]# hash
hits command
0 /lol-wut/ls
[[email protected] ~]#
Sie würden dies meistens nur tun wollen, wenn Sie etwas aus der Hash-Tabelle entfernen möchten und nicht zu 100% sicher sind, dass Sie sich erfolgreich abmelden und wieder anmelden können, oder wenn Sie einige Änderungen, die Sie an Ihrer Shell vorgenommen haben, beibehalten möchten.
Um veraltete Zuordnungen loszuwerden, können Sie auch hash -r
ausführen (oder export PATH=$PATH
), wodurch praktisch nur die gesamte Hash-Tabelle von bash gelöscht wird.
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.