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

72

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

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

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

    
задан zetah 18.11.2011 в 07:39
источник

4 ответа

65

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

export PROMPT_COMMAND='history -a'
     

Чтобы процитировать manpage: «Если установлено, значение выполняется как команда перед выдачей каждого основного приглашения».

     

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

     

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

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

См. также:

ответ дан jcollado 18.11.2011 в 07:52
источник
26

После нескольких чтений 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 в цепочке сортировки).

    
ответ дан waltinator 20.11.2011 в 00:48
3

Чтобы отобразить history от всех терминалов:

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

Источник: Ссылка /comment-page-1/index.html#comment-640

ответ дан Elijah Lynn 31.10.2013 в 20:17
2

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

ответ дан Eli Bendersky 25.01.2016 в 00:33