Обробка історії Bash з декількома терміналами


110

Я використовую в основному Terminator, і він зазвичай відкривається з 3 розділеними термінальними вікнами. Я також використовую термінал Gnome з різних причин.
Мені цікаво, як в цій справі обробляється історія башів, оскільки я іноді пропускаю раніше видані команди при запускуhistory

Наприклад, у моєму підказці відображається поточна лінія історії bash ( \!), і якщо я запускаю Terminator з 3 розділеними вікнами терміналів, я отримую ту саму лінію історії (скажімо 100) на всіх терміналах. Яку історію буде збережено?

Також запускаючи Gnome Terminal після використання Terminator, я отримую рядок 100 при запуску незалежно від усіх команд, виданих раніше в Terminator


Відповіді:


107

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

export PROMPT_COMMAND='history -a'

Процитуйте сторінку сторінки: "Якщо встановлено, значення виконується як команда перед видачею кожного первинного запиту."

Тож кожен раз, коли моя команда закінчена, вона додає до неписаного елемента історії ~/.bash_historyперед тим, як знову відображати підказку (лише $ PS1).

Тож після введення цієї лінії /etc/bash.bashrcмені не доведеться винаходити колеса або втрачати цінні секунди, повторно набираючи речі тільки тому, що я лінувався зі своїми терміналами.

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

Дивитися також:


це не зберігається окремо для різних TTL ??
Vineet Menon

Відмінно. Дякуємо за пояснення та рішення. Я спробував, export PROMPT_COMMAND='history -a; history -r'і у мене з'явилися декілька дивних номерів рядків історії в терміналі - після видачі деякого номера рядка історії команд стрибає до 2000 року, а не 1, що дивно, але воно поводиться так, як сказано - всі історії терміналів зберігаються.
zetah

@VineetMenon Детальніше дивіться тут . Цікаві частини: Коли запускається оболонка, історія ініціалізується з файла, названого змінною HISTFILE (за замовчуванням `~ / .bash_history '). [...] Коли інтерактивна оболонка виходить, останні рядки $ HISTSIZE копіюються зі списку історії у файл, який називається $ HISTFILE.
jcollado

Цей веб - сайт , здається вниз: northernmost.org/blog/flush-bash_history-after-each-command
Shubham


32

Після декількох читань man bashя використовую окремі файли історії для кожної оболонки. Я mkdir -m 0700 ~/.historyтоді додав

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

до моїх ~/.bashrc. Раз у раз, я пам’ятаю, du -sk .historyчи прибирати це. Приємно, щоб кожна команда, яку я набрав, збереглася для мене.

Я просто використовував вище, щоб побачити, що я робив, із запізненням:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
або
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(щоб включити 1-й аргумент, наприклад, sudo mountу ланцюжок сортування).


3
Чому ви призначаєте HISTFILESIZEдвічі?
Даніель

2
Встановивши HISTFILESIZE на 0, я очищую буфер історії та скидаю механізм збереження історії. Потім я встановлюю потрібний розмір і починаю зберігати історію в HISTFILE. Дивіться розділ ІСТОРІЯ man bash.
waltinator

1
чи є спосіб злити файли історії, щоб Ctrl+rзнову працювати?
n611x007

3
Це має бути новим питанням, але я не думаю, що це гарна ідея. Я використовую egrep 'whatever' .history/*(або cat .history/* | egrep 'whatever') замість цього і використовую Ctrl-r для пошуку історії окремих сеансів. Читайте man bash-builtinsпро команду історії. Мої sort .history/* | uniq -c | sort -n | wc -lпоказує 16033 унікальних команд, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nпоказує 2004 унікальних команд, в основному друкарських помилок. Завантаження всього цього у "історічний список" bash не допоможе.
waltinator

@waltinator - я знаю, що це старий коментар, але ви маєте на увазі, що встановлення змінної середовища якось викликає негайну дію? який процес буде збирати той факт, якому ви присвоїли значення HISTFILESIZE у локальній оболонці, а потім негайно змінити на 4096? це щось незадокументоване в поводженні з bash певними назвами змінних?
несинхронізований

8

Щоб показати historyз усіх терміналів:

Додайте export PROMPT_COMMAND='history -a; history -r'у свій .bashrc файл.

Джерело: http://northernmost.org/blog/flush-bash_history-after-each-command



3
Я скажу, що через пару місяців використання цього я зрештою прокоментував це зовсім недавно. Це гірче, тому що я не завжди хочу просіяти останні 100 команд просто для запуску тієї, яку я запускав спочатку на панелі Tmux, у мене іноді може бути спеціальна команда журналу, що мені потрібно перезапустити.
Ілля Лінн

Гарне рішення, яке пропонує рибна шкаралупа - це history --merge. Я використовую це вже рік або близько того, і це вирішує проблему. Коли я хочу отримати останню історію з інших сеансів, я просто запускаю цю команду, і вона мені доступна миттєво.
Ілля Лінн

експорт не потрібен.
Обмежене спокутування

6

Дивіться також " Зберігання стійкої історії в баші " для іншої альтернативи. Він встановлює ваше запрошення надіслати всі команди, коли-небудь введені в будь-який термінал, у файл "постійної історії" (поряд із тим, що зазвичай робиться для звичайних .history).


1
Я вставив $$, щоб зробити рядок. echo $$ $date_part "$command_part" >> ~/.persistent_historyЦей префікс записує PID-адреси їх bash-процесу, щоб ми могли роз'єднати кілька історій.
Євгеній Сергєєв

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