Вимкнення кеш-файлу кеш-файлу виконуваних файлів на шляху


12

Зауважте, що це не дублікат. Я прошу відключити кеш, не очищаючи його. Якщо у вас є кеш для очищення, він, очевидно, не відключений.

У рідкісних випадках я помічаю кеш-пам'ять речей, які він знайшов на шляху, це не тому, що це корисно, це тому, що це криваво дратує. Приклад:

~ 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

В іншій оболонці ...

~ dc$ which which
/usr/bin/which

Я впевнений, що це кешування мало сенс ще в старі добрі часи, коли диски були повільними, а пам’ять була дорогою і обмеженою, і тому ви не могли багато кешувати - кешування шляху дешевше, ніж кешування всіх дискових блоків, необхідних для пошуку команди . Але в наші дні це не дає помітної користі та створює більше проблем, ніж вирішує. Це невдача, що може бути помилкою.

І я навіть не можу знайти спосіб її відключити. Якісь покажчики?


1
Переваги помітні навіть у звичайному випадку настільної машини, якщо у вас не так багато оперативної пам’яті, яка /usr/binповністю залишається в кеші.
Жил 'SO- перестань бути злим'

1
@drhyde, вибач. Це питання я позначив як дублікат. Використовуйте set +hдля відключення хешування.
Євгеній Верещагін

У Nixos він відключив хеш у своєму баш. Думаю, з поважної причини через спосіб роботи Nixos. Однак я не впевнений, чи справді це обов'язково для Nixos. Я лише кажу, що хеш в баш може принести проблеми в певних ситуаціях.
типолог

Відповіді:


12

Ви можете просто очистити хешовані виконувані файли, перш ніж з'явиться підказка:

PROMPT_COMMAND='hash -r'

Від 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
@EvgenyVereshchagin set +hне є ідеальним, оскільки багато комунальних служб (наприклад, рубінові дорогоцінні установки) дзвонять hash, створюючи потоки -bash: hash: hashing disabledпопереджень.
Девід Молес

Я також бачу ті самі попереджувальні повідомлення в активації python virtualenv. Але я думаю, це нешкідливо.
друкарня

8

Ви можете змусити bash зробити новий пошук шляху, якщо команда в хеш-таблиці більше не існує.

shopt -s checkhash

З сайту "Баш":

чехаш

    Якщо встановлено, bash перевіряє, чи існує команда, знайдена в хеш-таблиці, перш ніж спробувати її виконати. Якщо команда хешування більше не існує, виконується звичайний пошук шляху.

Приклад:

[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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.