Wyłącz pamięć podręczną plików wykonywalnych bash na ścieżce

12

Pamiętaj, że to nie jest duplikat. Pytam o wyłączenie pamięci podręcznej, a nie jej wyczyszczenie. Jeśli masz pamięć podręczną do wyczyszczenia, to oczywiście nie jest wyłączona.

W rzadkich przypadkach, gdy zauważam pamięć podręczną bash o rzeczach znalezionych na ścieżce, to nie dlatego, że jest pomocna, ale dlatego, że jest cholernie denerwująca. Przykład:

~ 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

W innej powłoce ...

~ dc$ which which
/usr/bin/which

Jestem pewien, że to buforowanie miało sens w dawnych dobrych czasach, gdy dyski były powolne, a pamięć była droga i ograniczona, więc nie można było dużo buforować - buforowanie ścieżki jest tańsze niż buforowanie wszystkich bloków dysku niezbędnych do znalezienia polecenia . Ale obecnie nie zapewnia zauważalnych korzyści i powoduje więcej problemów niż rozwiązuje. To mylna cecha, granicząca z błędem.

I nie mogę nawet znaleźć sposobu, aby to wyłączyć. Jakieś wskazówki?

DrHyde
źródło
1
Korzyści są zauważalne nawet w zwykłym przypadku komputera stacjonarnego, jeśli nie masz tyle pamięci RAM, która /usr/binpozostaje całkowicie w pamięci podręcznej.
Gilles „SO- przestań być zły”,
1
@drhyde, przepraszam. Oznacziłem to pytanie jako duplikat. Użyj, set +haby wyłączyć haszowanie.
Evgeny Vereshchagin
W Nixos wyłączył hash w swoim bashu. Myślę, że nie bez powodu ze względu na sposób pracy Nixos. Nie jestem jednak pewien, czy to naprawdę obowiązkowe dla Nixos. Mówię tylko, że skrót w skrócie może powodować problemy w niektórych sytuacjach.
typelogiczny

Odpowiedzi:

12

Możesz po prostu wyczyścić zaszyfrowane pliki wykonywalne przed wyświetleniem monitu:

PROMPT_COMMAND='hash -r'

Od 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.
Chris Down
źródło
1
zobacz moją odpowiedź na tematset +h
Evgeny Vereshchagin
1
@EvgenyVereshchagin set +hnie jest idealny, ponieważ wiele narzędzi (np. Instalacje klejnotów rubinowych) wywołuje hash, generując strumienie -bash: hash: hashing disabledostrzeżeń.
David Moles,
Widzę także te same komunikaty ostrzegawcze w aktywacji virtualenv python. Ale myślę, że to nieszkodliwe.
typelogiczny
8

Możesz wymusić na bash, aby wykonał nowe wyszukiwanie ścieżki na wypadek, gdyby polecenie w tabeli skrótów już nie istniało.

shopt -s checkhash

Z strony podręcznika bash:

checkhash

    Jeśli jest ustawiony, bash sprawdza, czy polecenie znalezione w tabeli skrótów istnieje, zanim spróbuje je wykonać. Jeśli polecenie skrótu już nie istnieje, przeprowadzane jest normalne wyszukiwanie ścieżki.

Przykład:

[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
użytkownik70408
źródło