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

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

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

160
задан 12 July 2012 в 06:55

4 ответа

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

Говорится о том, чтобы поместить эти команды в .bashrc config:

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

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

Связанная с zsh:

119
ответ дан 12 July 2012 в 06:55

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

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

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

44
ответ дан 12 July 2012 в 06:55

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

69
ответ дан 12 July 2012 в 06:55

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

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

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

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

8
ответ дан 12 July 2012 в 06:55

Другие вопросы по тегам:

Похожие вопросы: