Deaktivieren Sie den Bash-Cache für ausführbare Dateien im Pfad


11

Beachten Sie, dass dies kein Duplikat ist. Ich frage nach dem Deaktivieren des Caches, nicht nach dem Löschen. Wenn Sie einen Cache löschen müssen, ist dieser offensichtlich nicht deaktiviert.

In den seltenen Fällen, in denen ich Bashs Cache mit Dingen bemerke, die er im Pfad gefunden hat, liegt es nicht daran, dass es hilfreich ist, sondern daran, dass es verdammt nervig ist. Ein Beispiel:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

In einer anderen Hülle ...

~ dc$ which which
/usr/bin/which

Ich bin mir sicher, dass dieses Caching in den guten alten Zeiten Sinn machte, als die Festplatten langsam und der Speicher teuer und begrenzt waren und Sie daher nicht viel zwischenspeichern konnten. Das Zwischenspeichern eines Pfads ist billiger als das Zwischenspeichern aller Festplattenblöcke, die zum Auffinden eines Befehls erforderlich sind . Aber heutzutage bietet es keinen spürbaren Nutzen und verursacht mehr Probleme als es löst. Es ist eine Fehlfunktion, die fast ein Fehler ist.

Und ich kann nicht einmal einen Weg finden, es zu deaktivieren. Irgendwelche Hinweise?


1
Die Vorteile machen sich auch im normalen Fall eines Desktop-Computers bemerkbar, wenn Sie nicht so viel RAM haben, das /usr/binvollständig im Cache verbleibt.
Gilles 'SO - hör auf böse zu sein'

1
@drhyde, sorry. Ich habe diese Frage als Duplikat markiert. Verwenden Sie set +hdiese Option, um das Hashing zu deaktivieren.
Evgeny Vereshchagin

In Nixos wurde der Hash in seiner Bash deaktiviert. Ich denke, aus gutem Grund wegen der Arbeitsweise von Nixos. Ich bin mir jedoch nicht sicher, ob dies für Nixos wirklich obligatorisch ist. Ich sage nur, dass ein Hash in Bash in bestimmten Situationen Probleme bringen kann.
typelogic

Antworten:


12

Sie können die gehashten ausführbaren Dateien einfach löschen, bevor die Eingabeaufforderung gezeichnet wird:

PROMPT_COMMAND='hash -r'

Von help hash:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.

1
siehe meine Antwort überset +h
Evgeny Vereshchagin

1
@EvgenyVereshchagin set +hist nicht ideal, da viele Dienstprogramme (z. B. Ruby Gem-Installationen) aufrufen hashund Warnströme erzeugen -bash: hash: hashing disabled.
David Moles

Ich sehe die gleichen Warnmeldungen auch in einer Python Virtualenv-Aktivierung. Aber ich denke, es ist harmlos.
typelogic

8

Sie können bash zwingen, eine neue Pfadsuche durchzuführen, falls ein Befehl in der Hash-Tabelle nicht mehr vorhanden ist.

shopt -s checkhash

Aus der Bash-Manpage:

Checkhash

    Wenn gesetzt, überprüft bash , ob ein in der Hash-Tabelle gefundener Befehl vorhanden ist, bevor versucht wird, ihn auszuführen. Wenn kein Hash-Befehl mehr vorhanden ist, wird eine normale Pfadsuche durchgeführt.

Beispiel:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.