Де зберігається історія башу?


95

Якщо я біжу history, я бачу свої останні виконані команди.

Але якщо я tail -f $HISTFILEабо tail -f ~/.bash_historyвони не отримують в списку.

Чи закривається файл, є тимчасове місцеположення чи щось подібне?

Відповіді:


117

Bash підтримує список команд всередині пам'яті під час роботи. Вони записуються .bash_historyпри виході :

Коли інтерактивна оболонка виходить, останні рядки $ HISTSIZE копіюються зі списку історії у файл, названий $ HISTFILE

Якщо ви хочете змусити записувати історію команд, ви можете скористатися history -aкомандою, яка:

Додайте нові рядки історії (рядки історії, введені з початку поточного сеансу Bash) у файл історії.

Також є -wваріант:

Запишіть поточну історію у файл історії.

що може вам більше подобатись залежно від того, як саме ви використовуєте свою історію.

Якщо ви хочете переконатися, що вони завжди написані негайно, ви можете помістити цю команду у свою PROMPT_COMMANDзмінну:

export PROMPT_COMMAND='history -a'

Побічна примітка: якщо ваш .bash_historyфайл випадково перебуває у власності root, речі припиняють свою роботу. У такому випадку перевірте право власності та використовуйте sudoдля виправлення права власності, якщо це необхідно.
torek

13

(Не відповідь, але я не можу додавати коментарі)

Якщо ви перевіряєте, .bash_historyоскільки ви просто хочете видалити певну команду (наприклад, містить чіткий пароль), ви можете безпосередньо видалити запис у пам'яті користувачем history -d <entry_id>.

Наприклад, припустимо, такий вихід:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

і ви хочете очистити exportлінію, ви можете просто досягти її:

history -d 928

11

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

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


2
Початок вашої відповіді звучить так, ніби історія зберігається у файлі, який називається bash, або навіть у виконанні bash. Я б написав "Це зберігається bashв пам'яті, ..."
Антон

це справді краще
Антон

5

Команди зберігаються в пам'яті (ОЗП) під час активного сеансу. Як тільки ви закриєте оболонку, список команд записується до .bash_historyвимкнення.

Таким чином, ви не побачите історію поточного сеансу в .bash_history.


4
Файл історії оновлюється після bashзакінчення, що не передбачає перезавантаження (особливо в графічних середовищах, де ви можете відкривати та закривати термінали за своїм бажанням).
Джон У. Сміт

4

Під час роботи історія зберігається лише в пам'яті (за замовчуванням), якщо:

  • set -o встановлюється історія ( Hin echo "$-").
  • HISTSIZE не є 0 і
  • HISTIGNORE - це не *(або якась інша дуже обмежуюча модель).

Якщо будь-яке з перерахованих вище не вдається, жодна історія не зберігається в пам'яті, і, отже, жодна історія не може або не буде записана на диск.

Історія в пам'яті записується на диск, якщо:

  • HISTFILESIZE не 0 і
  • HISTFILE не скасовано.

Але лише тоді, коли оболонка виходить або якщо команди history -a(додавати) або history -w(записати) виконуються.

Для запуску негайного запису на диск можна використовувати змінну:

 PROMPT_COMMAND='history -a'

які Воля appendв newісторії рядки в файл історія. Це рядки історії, введені з початку поточного сеансу bash, але ще не додані до файлу історії.

Або:

 PROMPT_COMMAND='history -w'

Щоб перезаписати історію в HISTFILE зі списком із пам'яті.

Отже, ви можете видалити команду з історії в пам'яті:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

І запишіть його на диск з останньою командою:

 history -w    # with `shopt -u histappend` unset

Чи було б щось не так, поставивши це на роботу з кроном? Я підозрюю, що багато користувачів із значно меншими іменами користувачів входять на певний сервер, і все ще історія є досить маленькою, і це старий сервер, але, можливо, якийсь сеанс ніколи не закривається ...
oneindelijk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.