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


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

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


100
2017-10-16 03:09


происхождения


Обычно я использую control-r для обратного поиска в истории команд одного bash. Более удобно, чем history | grep если вам не нужно регулярное выражение. - Peter Cordes


ответы:


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

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

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

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

Связано с zsh:


70
2017-10-16 04:29



ну такие работы. Я попробовал еще несколько тестов и, похоже, работал только с первой командой. он работает правильно для вас? - Matt


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


50
2018-03-24 12:56



Brilliant! Благодарю. Интересно, почему эти параметры не документированы в man history... - artfulrobot
@artfulrobot: эта команда является bash встроенный, поэтому он описан в man bash, Вы также можете использовать help history, - pabouk
У меня есть zsh, который работает так: каждая оболочка отслеживает свою историю OWN (и до этого, объединенную историю), и каждая команда добавляется к объединенной истории. Это другой а также лучше чем всегда перезагрузка истории для каждой команды для каждой оболочки, потому что у меня, как правило, есть другой «поток работы» или «задание» для каждого терминала оболочки. Я думаю, что это разница между -r а также -c против -a, - Steven Lu
Итак, что именно вы используете? history -c; history -r? Я думаю, это лучше для вас, было бы лучше для меня только иногда, я часто использую несколько раковин для выполнения одной работы, поэтому я предпочитаю, чтобы история максимально сочеталась. Я действительно помню, что команда написана в историю только после ее завершения. как правило, когда я запускаю сеанс ssh на один хост и хочу открыть еще один, пока первый все еще работает, я должен повторить его, потому что он еще не был записан в историю. - sup
Я думаю, что я никогда не зацикливался достаточно долго, чтобы понять, как заставить bash одновременно отслеживать параллельные потоки истории (на основе экземпляра оболочки) в то время как сразу же записывая историю в основной файл истории. Zsh делает это намного проще, плюс, кроме того, я определил функцию zsh, чтобы выписать много причудливых метаданных повышенная история файл моего проекта. Это стало весьма незаменимым. Во всяком случае, в механизме есть precmd () и preexec () для zsh, которые отправляют args, описывающие введенную команду. Затем становится тривиальным направлять это в файлы. history -a может хватить - Steven Lu


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

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

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


30
2017-09-12 12:23



Brilliant! Больше нет потерянной истории, когда соединение падает! - Tobia
Это замечательно. Добавляя файл и считывая его из файла, он будет делиться историей на нескольких терминалах. - wisbucky


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

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

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

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


2
2017-07-04 10:22



На моем mac 10.13.6 казалось, что это не сработало без shopt -s histappend, Также обратите внимание, что я добавил его в свой ~/.bash_profile - ubershmekel
Вероятно, в вашей системе есть еще одна настройка, которая отключена histappend, поскольку это поведение по умолчанию. Я бы поискал его, но у меня нет доступа к Mac. - Guss