Чи можна об’єднати файли історії в bash?


35

Я регулярно запускаю кілька screenсеансів на своїх робочих столах та серверах Linux.

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

Чи можна «примусити» різні оновлені історії від кількох сеансів до всіх переходити до центральної історії?


Я зіткнувся з подібною проблемою, внаслідок якої мені не вдалося переглянути історію між термінальними сеансами. Виявляється, мій файл ~ / .bash_history був власником root та не піддавався запису. Зміна власника / групи моєму користувачеві виправила проблему: sudo chown <user>: <group> ~ / .bash_history
mateo

Відповіді:


41

Вам потрібно зробити дві речі:

  1. Вставте команду shopt -s histappendу свій .bashrc. Це додасть до файлу історії замість перезапису.
  2. Крім того, у ваш .bashrc, вставте PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"і файл історії буде переписаний і перечитаний кожен раз, коли bash відображає підказку.

EDIT: Завдяки e-t172 за history -nхитрість


6
Дякую за це Я вдосконалив її далі, використовуючи PROMPT_COMMAND = "$ PROMPT_COMMAND; історія -a; історія -n". Таким чином, команди, видані в інших сесіях, негайно з’являються в історії поточного сеансу (ну, для оновлення історії потрібно спочатку натиснути Enter).
Етьєн Дечампс

8
Я PROMPT_COMMANDраніше не визначався, тому довелося використовувати, PROMPT_COMMAND="history -a; history -n"щоб уникнути помилок.
Вільям Джексон

1
дивіться відповідь superuser.com/a/734410/250287 для правильної команди -a, -c та -r.
mtd

Просто попередження для новачків: після деякого часу переписування історії я зрозумів, що часто видаю неправильні команди; коли ви побачите в попередньому рядку якусь команду, ви очікуєте, що стрілка вгору повторить її, і з цією конфігурацією це не завжди так.
Тіаго

11

Будь ласка, не використовуйте history -a; history -n, це не працює, як ви очікували, і залишить у вас багато дублікатів команд, що не вийшли з ладу, в історії. Рішення, яке працює як правило, наступне:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

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


історія -a, -c, а потім -r вірно ... це має бути прийнята відповідь
mtd

1
exportНе потрібно. Оскільки передбачається встановити інтерактивні параметри оболонки, з ~/.bashrcяких викликається кожен підрозділ, тому успадкування не потрібно.
долмен

Чи є вагомі причини не просто використовувати PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"замість цього?
Шість

Це впорядкування вимагатиме збереження останнього значення виходу перед запуском команд історії, оскільки багато команд-підказок покладаються на або відображають його.
Адам Крейн

-1

У деяких дистрибутивах PROMPT_COMMAND не визначено за замовчуванням. Наприклад, це визначено в Arch, але не в Debian.

У моєму Dropbox є bashrc, який я використовую під час стрибків distro, і він включає:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

Жахливе рішення основної проблеми програмування оболонки. Правильний шлях:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen

Краще:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
долмен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.