Можно ли сделать запись в .bash_history немедленной?

Можно ли сделать запись в .bash_history немедленной?

Я часто открываю множество терминалов (сейчас у меня открыто семь терминалов на этом рабочем месте) и часто выполняю поиск, historyчтобы grepнайти команду, которую я недавно написал, но я не хочу искать ее в терминале, а затем прокручивать вверх и искать ее.

Иногда мои терминалы закрываются без exit, и все, что я написал в них, теряется. Иногда мне нужно было что-то, что я написал в терминале, который был убит.

Есть ли способ сделать так, чтобы каждый терминал писал .bash_historyнемедленно? Или хотя бы раз в минуту, или что-то в этом роде?

решение1

Простое решение подробно описано вОбновление истории Bash в реальном времени.

Там говорится, что нужно поместить эти команды в конфигурацию .bashrc:

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

Первая команда изменяет режим файла истории на append, а вторая настраивает команду history -aна запуск в каждом приглашении оболочки. Опция -aзаставляет historyнемедленно записывать текущие/новые строки в файл истории.

Отman bash:

Если включена опция оболочки histappend (см. описание shopt в разделе ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ ниже), строки добавляются в файл истории, в противном случае файл истории перезаписывается.

Похожие для Zsh:

решение2

Попробуйте вставить это в свой .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.

Я думаю, это означает, что команды доступны почти сразу (у вас есть один терминал, write echo 1, второй терминал echo 2, первый echo 3и после двойного нажатия стрелки вниз, вы должны быть echo 2доступны. Вы должны ввести команду в данном терминале, чтобы получить доступ к тому, что было записано.

решение3

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

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

PROMPT_COMMANDне требует экспорта, поскольку это переменная оболочки.

решение4

Примечание для всех остальных ответов (которые по сути одно и то же):

Достаточно установить (или PROMPT_COMMAND="history -a;$PROMPT_COMMAND"друзей )..bashrc

Кроме того, вы можете вручную запустить его, history -aкогда захотите, чтобы сделать «снимок» истории текущего сеанса.

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

Связанный контент