Управление историей Bash с несколькими терминалами

Я использую в основном Terminator, и обычно он открывается с тремя разделенными терминальными окнами. Я также использую терминал Gnome по разным причинам. Мне интересно, как история bash обрабатывается в этом случае, поскольку я иногда пропускаю ранее выпущенные команды, когда я запускаю history

Например, моя подсказка показывает текущую строку истории bash (\!), и если я запуск Terminator с 3-мя разделительными терминальными окнами. Я получаю одну и ту же строку истории (скажем, 100) на всех терминалах. Какая история будет сохранена?

Также запускает терминал Gnome после использования Terminator. Я получаю строку 100 при запуске независимо от всех команд, выпущенных ранее в Terminator

1
задан 22 June 2015 в 12:14

3 ответа

После нескольких чтений man bash я использую отдельные файлы истории для каждой оболочки. Я сделал mkdir -m 0700 ~/.history, а затем добавил

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

к моему ~/.bashrc. Время от времени я вспоминаю du -sk .history и очищаю его. Приятно, чтобы каждая команда, которую я напечатала, сохранялась для меня.

Я только что использовал выше, чтобы посмотреть, что я делал в последнее время: cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less или cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less (чтобы включить 1-й аргумент, например sudo mount в цепочке сортировки).

26
ответ дан 25 May 2018 в 16:44
  • 1
    Почему вы назначаете HISTFILESIZE дважды? – Daniel 11 October 2012 в 12:26
  • 2
    Установив HISTFILESIZE на 0, я очищаю буфер истории и сбрасываю механизм сохранения истории. Затем я установил размер, который действительно хочу, и начните сохранять историю в HISTFILE. См. Раздел ИСТОРИЯ man bash. – waltinator 18 October 2012 в 09:20
  • 3
    есть ли способ объединить файлы истории, чтобы сделать Ctrl+r работать снова? – n611x007 14 March 2013 в 22:45
  • 4
    Это должен быть новый вопрос, но я не думаю, что это хорошая идея. Вместо этого я использую egrep 'whatever' .history/* (или cat .history/* | egrep 'whatever') и использую Ctrl-r для поиска истории отдельного сеанса. Прочитайте man bash-builtins об истории команды. Мой sort .history/* | uniq -c | sort -n | wc -l показывает 16033 уникальных команды, cut '-d ' -f1 .history/* | sort | uniq -c | sort -n показывает уникальные команды 2004 года, в основном опечатки. Загрузка всего этого в список истории "bash's " не помогло бы. – waltinator 18 March 2013 в 06:46

Показать history со всех терминалов:

Добавить export PROMPT_COMMAND='history -a; history -r' в ваш .bashrc-файл.

Источник: http://northernmost.org/blog/flush- bash_history-after-each-command / comment-page-1 / index.html # comment-640

4
ответ дан 25 May 2018 в 16:44
  • 1
    Я скажу, что через пару месяцев после этого я в конце концов прокомментировал это совсем недавно. Это горько, поскольку я не всегда хочу просеивать последние 100 команд, чтобы запустить ту, которую я изначально запускал в области Tmux. Иногда у меня может быть выделенная команда журнала, в которой мне нужно перезапустить. – Elijah Lynn 13 February 2014 в 20:16
  • 2
    Хорошим решением, которое предлагает рыба, является history --merge. Я использую это уже год или около того, и это решает проблему. Когда мне нужна последняя история из других сеансов, я просто запускаю эту команду, и она доступна мне мгновенно. – Elijah Lynn 8 May 2018 в 00:38

См. также «Сохранение постоянной истории в bash» для другой альтернативы. Он настраивает ваше приглашение отправлять все команды, когда-либо введенные в любой терминал, в файл «постоянной истории» (наряду с тем, что обычно делается для обычного .history).

3
ответ дан 25 May 2018 в 16:44
  • 1
    Я вставил $$ , чтобы сделать строку echo $$ $date_part "$command_part" >> ~/.persistent_history. Это префикс записей с PID их процесса bash, чтобы мы могли распутать несколько историй. – Evgeni Sergeev 29 March 2018 в 06:11

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

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