Втрата історії Bash при використанні histappend


18

Мені подобається зберігати багато історії, тому я histappendпоставив свою .bashrc. Здебільшого все працює добре, історія складається з багатьох оболонок. Однак раз на час я запускаю нову оболонку і виявлю, що втратив всю історію - і вона часто містить лише деякі команди з останньої оболонки для виходу (тобто це не просто перезапис, а не додавання ). Через це я підозріло, що це відбувається при виході з оболонки, а не через якийсь інший процес, що вбиває .bash_historyфайл. Підтримуючи цей висновок, у своєму запиті є номери команд історії, і я ніколи не бачив, щоб вони стрибали вниз.

Хто-небудь стикався з подібною проблемою? Або навіть просто є пропозиції, як віднайти проблему?


Відповіді:


13

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

Я, нарешті, зрозумів, що це відбувається лише при закритті gnome-terminalсебе (тобто файл> вихід, кнопка 'x', alt + F4), і навіть тоді взагалі лише при закритті декількох терміналів у швидкій послідовності. Ніколи не буває при використанні ctrl-D для закриття оболонки, дозволяючи терміналу слідувати.

Якщо я зможу це досить чітко визначити, я подаю звіт про помилку-термінал gnome. Тим часом, можливо, це допоможе іншим людям, які потрапляють сюди з google!


10

Поняття не має, чому це трапляється, але, можливо, ви можете обійти проблему, змушуючи bash записувати у свій файл історії кожен раз, коли він відображає підказку:

PROMPT_COMMAND="history -a; history -n"

Це буде писати (-a), а потім перечитувати (-n) файл історії кожен раз, коли bash підкаже наступну команду. Додаткова вигода: ви отримаєте команду X в оболонці 1 в історії оболонки 2.


Не працює на GNU bash, версія 3.00.15 (1) -release (i686-redhat-linux-gnu)
David Mackintosh

2
Чи можете ви пояснити, що означає "не працює"?
innaM

3
Додаткова вигода, яку ви наводите, - це в багатьох випадках зворотний бік. Це не та поведінка, яку я шукаю, оскільки, можливо, я виконую два цілком окремі завдання в окремих оболонках, і не хочу переплутати їх історію. Це також, ймовірно, нічого не допоможе. Коли історія зникає, вона видаляє вміст .bash_history - я не сподіваюся, що це має значення, написані вони при виході з оболонки або PROMPT_COMMAND.
Каскабель

5
history -nлускатий. Це зробити надійніше history -a; history -c; history -r. Щоб пояснити це, спершу зауважу, що history -aце правильно - ваша .bash_historyбуде містити всі ваші команди, які ви ввели, у тому порядку, який ви їх ввели, припускаючи, що ви виконуєте history -aпісля кожної команди. Завдання полягає в тому, щоб тримати уявлення про оболонку історії про синхронізацію з файлом .bash_history. Це легко -cі -r, проблема полягає в тому, що це може бути повільно, якщо він великий. -nможе зламатися, оскільки неправильно визначає, які рядки нові. (У мене тут не вистачає місця!)
Аарон Макдейд

4
(... якщо ви використовуєте -n) Уявіть , що ви виконуєте команду в оболонці 1: ls. Потім в іншій оболонці, Shell Two, ви виконайте виконання cd. Тепер історія в .bash_history правильна, оскільки history -aу вашому PROMPT_COMMAND- вона буде містити ls \n cd \n. Далі ви повертаєтесь до оболонки Один і введіть pwd. Shell One вважає, що існувала лише команда n історія ( ls). Тепер він вважає, що в історії є дві команди ( lsі pwd). Коли ви -nце зробите, думаєте (у мене є дві команди в моїй історії, і в команді .bash_history є дві команди, тому я в курсі).
Аарон Макдейд

3

Мій досвід полягав у тому, що оболонки оновлювали файл історії під час виходу. Отже, початкова "історія" оболонки залежала від перегляду останніх даних про оболонку історії.

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


2
Я дуже добре розумію, як пишеться файл історії - саме тому я вказав у своєму питанні, яким я користуюся histappend. Проблема - не несподіваний контент, а повна втрата раніше збереженого вмісту.
Каскабель

Це пояснює, чому я втрачав свою історію ...
B Сім

1

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

Щось, що могло б уникнути цього, було б тримати обрізку файлу до 80 рядків або скільки завгодно команд, якими ви хочете, щоб історія була.


У мене немає кореневого доступу на машині, на якій це відбувається, але я впевнений, що з диском нормально. Мій домашній каталог зберігається на сервері в нашій лабораторії (я вважаю, що багато RAID) і встановлений на nfs. Що ви маєте на увазі під "довільною межею історії оболонки"? Це все відбувається набагато нижче HISTSIZE та HISTFILESIZE, і хоча я обидва встановив великі розміри, вони значно нижче, ніж intbash зберігає їх як.
Каскабель

Я б сказав, що запис Девіда Макінтоша - це, мабуть, те, що відбувається.
Axxmasterr

1
Я повністю впевнений, що це не так. Я ніколи не повинен закінчуватися лише двома командами в моїй історії, коли в останній оболонці для виходу було пару десятків команд, у файлі історії було декілька сотень, а HISTSIZE / HISTFILESIZE встановлено на 10000.
Cascabel,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.