Чи можна негайно зробити запис у .bash_history?


124

Я часто відкривати багато і багато терміналів [Зараз у мене є 7 відкрити на цьому робочому просторі] , і я часто пошуку historyз , grepщоб знайти команду , я тільки що написав недавно, але я не хочу , щоб вистежити термінал , а потім виконайте прокрутку вгору і полювати за цим більше тощо. Іноді мої термінали закриваються без "виходу", і все, що я написав, втрачається [Іноді мені потрібно щось, що я написав у терміналі, що був убитий].

Так чи є спосіб зробити так, щоб кожен термінал негайно записував у .bash_history? чи хоча б раз на хвилину, чи щось подібне?


2
Зазвичай я використовую control-rдля зворотного пошуку в історії команд одного bash. Зручніше, ніж history | grepякщо вам не потрібен регулярний вираз.
Пітер Кордес

Відповіді:


92

Просте рішення, докладно описане в " Оновити історію башів у реальному часі" .

Він говорить, щоб помістити ці команди в .bashrc config:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

Перша команда змінює .historyрежим файлу для додавання. А другий налаштовує history -aкоманду, яку потрібно виконати в кожному запиті оболонки. -aНегайно записує поточні / нові рядки в файл історії.

Пов’язані з zsh:


1
добре цей вид робіт. Я спробував ще кілька тестувань і, здається, працює лише над першою командою. це працює для вас правильно?
Метт

54

Спробуйте вкласти це у свої .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Кредит тут: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cочищає історію запущеного сеансу. Це зменшить лічильник історії на суму $HISTSIZE. history -rпрочитати вміст $HISTFILEта вставити їх у поточну історію запущених сесій. Це підніме лічильник історії на кількість рядків у $HISTFILE.

Я думаю, що це означає, що команди доступні майже відразу (у вас є один термінал, запис echo 1, другий термінал echo 2, перший echo 3і після натискання стрілки вниз двічі ви повинні мати echo 2доступ. Ви повинні видати команду в заданому терміналі, щоб мати доступ до того, що має було написано.


Блискуче! Дякую. Цікаво, чому ці варіанти не зафіксовані в man history
artfulrobot

10
@artfulrobot: Ця команда є bashвбудованою, тому вона описана в man bash. Ви також можете використовувати help history.
пабук

2
У мене zsh налаштовано так: Кожна оболонка відстежує свою власну історію (а до цього - комбіновану історію), і кожна команда додається до комбінованої історії. Це відрізняється і краще, ніж завжди перезавантажувати історію для кожної команди для кожної оболонки, оскільки я, як правило, має різний "потік роботи" або "завдання" для кожного терміналу оболонки. Я думаю, що це різниця між цим -rі -cпроти просто маючим -a.
Стівен Лу

Отже, що саме ви використовуєте? history -c; history -r? Я здогадуюсь, що тобі краще, мені краще було б іноді, я часто використовую кілька снарядів, щоб виконувати одну роботу, тому я вважаю за краще, щоб історія була максимально поєднаною. Я насправді заперечую, що команда пишеться в історію лише після її закінчення. зазвичай, коли я запускаю ssh-сеанс для одного хоста і хочу відкрити інший, поки перший все ще запущений, мені доведеться повторно вводити його, оскільки він ще не записаний в історію.
суп

Я думаю, що я ніколи не затримувався досить довго, щоб зрозуміти, як змусити баш одночасно відслідковувати паралельні потоки історії (на основі екземпляра оболонки), одночасно записуючи історію в основний файл історії. Zsh робить це набагато простіше, плюс до того ж я визначив функцію zsh, щоб виписати багато фантазійних метаданих у файл з розширеною історією моєї розробки. Це стало досить незамінним. У будь-якому випадку механізмом є precmd () і preexec () для zsh надсилаються аргументи, що описують введену команду. Потім це стає тривіально направляти це на файли. history -aможе вистачити
Стівен Лу

38

У мене великий файл історії з близько 100000 записів, і варіанти, які очищають список історії та читають весь файл історії (використовуючи history -cта history -r), вводять помітну (можливо, 0,2 секунду) затримку до появи запиту. Використовуючи history -nтак, що з файлу історії швидше зчитуються лише нові рядки:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND не потрібно експортувати, оскільки це змінна оболонка.


Блискуче! Більше втраченої історії, коли зв’язок перестане!
Тобія

Це чудово. Додаючи до файлу та читаючи з файлу, він поділиться історією через декілька терміналів.
вісбукі

3

Примітка для всіх інших відповідей (які в основному те саме):

Встановлення PROMPT_COMMAND="history -a;$PROMPT_COMMAND"в .bashrc(або друзів) достатньо.

Крім того, ви можете вручну запускати, history -aколи хочете "зробити знімок" історії в поточному сеансі.

Команда shopt -s histappendне потрібна, оскільки history -aзавжди додає у файл нові рядки і ніколи не перезаписує її. Також, принаймні, як у Bash 4, histappendє поведінка за замовчуванням.


На моєму Mac 10.13.6 здавалося, що це не спрацює без shopt -s histappend. Також зауважте, що я додав її до свого~/.bash_profile
ubershmekel

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