Wenn ich ein Programm ohne Angabe des vollständigen Pfads zur ausführbaren Datei ausführe und Bash die Verzeichnisse durchsuchen muss $PATH
, um die Binärdatei zu finden, scheint sich Bash den Pfad in einer Art Cache zu merken. Zum Beispiel habe ich einen Build von Subversion von der Quelle bis installiert /usr/local
und dann svnsync help
an der Bash-Eingabeaufforderung eingegeben . Bash hat die Binärdatei /usr/local/bin/svnsync
für "svnsync" gefunden und ausgeführt. Wenn ich dann die Installation von Subversion in gelöscht /usr/local
und erneut ausgeführt habe svnsync help
, antwortet Bash:
bash: /usr/local/bin/svnsync: No such file or directory
Wenn ich jedoch eine neue Instanz von Bash starte, wird diese gefunden und ausgeführt /usr/bin/svnsync
.
Wie lösche ich den Cache von Pfaden zu ausführbaren Dateien?
quelle
Antworten:
bash
Zwischenspeichert den vollständigen Pfad zu einem Befehl. Sie können überprüfen, ob der Befehl, den Sie ausführen möchten, mit dem folgendentype
Befehl gehasht wurde :So leeren Sie den gesamten Cache:
Oder nur ein Eintrag:
Weitere Informationen finden Sie unter
help hash
undman bash
.quelle
csh
, lautet der Befehlrehash
.rehash
Befehl funktioniert auch fürzsh
.hash svnsync
.Um nur einen Eintrag zu löschen, benötigen Sie eine andere Flagge:
Das
-r
Flag nimmt keinen Parameter an und löscht immer den gesamten Cache.(Zumindest in Bash 3.2.39 auf Debian Lenny)
quelle
Es gibt Lösungen, die hier nicht erwähnt werden.
Sie können Hashing mit
set +h
oder deaktivierenset +o hashall
help set
sagt:Sie können überprüfen, ob ein Befehl in der Hash-Tabelle vorhanden ist, bevor Sie versuchen, ihn mit auszuführen
shopt -s checkhash
help shopt
sagt:Sie können NAME mit PATH binden mit
hash -p PATH NAME
oderBASH_CMDS[NAME]=PATH
:Magie:
PATH="$PATH"
führthash -r
Von
variables.c
:Versuchen:
quelle
Wie Benutzer johntex in einem Kommentar zu der Antwort von Benutzer Tobu angemerkt hat , besteht die einfachste praktische Aktion in Bash darin, nur Ihr Programm erneut aufzubereiten:
Das ist alles.
quelle