Я часто открываю множество терминалов (сейчас у меня открыто семь терминалов на этом рабочем месте) и часто выполняю поиск, 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
это поведение по умолчанию.