Обработка истории Bash с несколькими терминалами


110

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

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

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


Ответы:


107

Сеанс bash, который сохранен, является тем для терминала, который закрыт самым последним. Если вы хотите сохранить команды для каждого сеанса, вы можете использовать прием, описанный здесь .

export PROMPT_COMMAND='history -a'

Процитируем man-страницу: «Если установлено, значение выполняется как команда перед выдачей каждого основного запроса».

Таким образом, каждый раз, когда моя команда завершает свою работу, она добавляет неписаный элемент истории, ~/.bash_historyпрежде чем снова отображать приглашение (только $ PS1).

Так что после того, как /etc/bash.bashrcя вставил эту строку, мне не нужно заново изобретать колеса или терять драгоценные секунды, перепечатывая вещи только потому, что я ленился со своими терминалами.

В любом случае, вам нужно учесть, что команды из разных сессий будут смешиваться в вашем файле истории, поэтому позже будет не так просто прочитать его.

Смотрите также:


не хранится ли отдельно для разных TTL ??
Вине Менон

Отлично. Спасибо за объяснение и решение. Я попытался, export PROMPT_COMMAND='history -a; history -r'и я получил некоторые странные номера строки истории в терминале - после выдачи некоторого числа строк истории команд скачки на 2000 вместо 1, что странно, но ведет себя как сказано - вся история терминала сохраняется.
Зета

@ VineetMenon Для более подробной информации смотрите здесь . Интересные части: при запуске оболочки история инициализируется из файла, названного переменной HISTFILE (по умолчанию «~ / .bash_history»). [...] При выходе из интерактивной оболочки последние строки $ HISTSIZE копируются из списка истории в файл с именем $ HISTFILE.
Jcollado

Этот веб - сайт , кажется вниз: northernmost.org/blog/flush-bash_history-after-each-command
Shubham


32

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

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# 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в цепочку сортировки).


3
Почему вы назначаете HISTFILESIZEдважды?
Даниил

2
Установив HISTFILESIZE в 0, я очищаю буфер истории и сбрасываю механизм сохранения истории. Затем я устанавливаю нужный размер и начинаю сохранять историю в HISTFILE. Смотрите раздел ИСТОРИЯ man bash.
Вальтинатор

1
Есть ли способ объединить файлы истории, чтобы заставить Ctrl+rработать снова?
n611x007

3
Это должен быть новый вопрос, но я не думаю, что это хорошая идея. Вместо этого я использую 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 не поможет.
Вальтинатор

@waltinator - я знаю, что это старый комментарий, но вы подразумеваете, что установка переменной окружения каким-то образом вызывает немедленное действие? какой процесс обнаружит тот факт, что вы присвоили значение 0 для HISTFILESIZE в локальной оболочке, а затем сразу изменили значение на 4096? это что-то недокументированное в обработке bash определенных имен переменных?
несинхронизировано

8

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

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

Источник: http://northernmost.org/blog/flush-bash_history-after-each-command



3
Я скажу, что после пары месяцев использования этого я в конечном итоге закомментировал это совсем недавно. Это горько-сладко, так как я не всегда хочу просеивать последние 100 команд только для того, чтобы запустить ту, которую я изначально запускал на панели Tmux. Иногда у меня может быть выделенная команда журнала, которую мне нужно перезапустить.
Элайджа Линн

Хорошее решение, которое предлагает рыбий панцирь - это history --merge. Я использую это в течение года или около того сейчас, и это решает проблему. Когда я хочу получить самую свежую историю из других сессий, я просто запускаю эту команду, и она доступна мне мгновенно.
Элайджа Линн

экспорт не нужен.
Ограниченное искупление

6

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


1
Я вставил $$, чтобы сделать строку. echo $$ $date_part "$command_part" >> ~/.persistent_historyЭто ставит префиксы в записи с PID их процесса bash, чтобы мы могли распутать несколько историй.
Евгений Сергеев,

Можно ли настроить альтернативную историю для поиска в истории CTRL-R?
максимум
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.