Возможно ли сразу написать письмо в .bash_history?

106

Я часто открываю много и много терминалов [Сейчас у меня есть 7 открытых в этой рабочей области], и я часто ищу history с grep , чтобы найти команду, которую я только что написал недавно, но я не хочу выслеживать терминал, а затем прокручивать вверх и охотиться за ним больше и т. д. Иногда мои терминалы закрываются без «выхода», и все, что я написал, теряется [Иногда мне нужно было что-то, что я написал в терминале, был убит].

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

    
задан Matt 16.10.2011 в 05:09
источник

4 ответа

76

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

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

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

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

Связано с zsh:

  • Как вы делитесь историей между терминалами в zsh?
ответ дан mario 16.10.2011 в 06:29
источник
51

Попробуйте поместить это в свой .bashrc :

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

Кредит здесь: Ссылка

history -c очищает историю текущего сеанса. Это уменьшит счетчик истории на сумму $HISTSIZE . history -r читает содержимое $HISTFILE и вставляет их в текущую текущую историю сеансов. Это увеличит счетчик истории на количество строк в $HISTFILE .

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

    
ответ дан sup 24.03.2012 в 13:56
31

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

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

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

    
ответ дан user4669748 12.09.2015 в 14:23
3

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

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

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

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

    
ответ дан Guss 04.07.2018 в 12:22