Сохраните историю удара в нескольких окнах терминала

grc, универсальный colourizer довольно прохладен.

apt-get install grc

Просто сделайте

grc tail -f /var/log/apache2/error.log

и наслаждайтесь!

Вы также найдете его на GitHub.

544
10.08.2016, 19:22
21 ответ

Добавьте следующее к ~/.bashrc

# Avoid duplicates
HISTCONTROL=ignoredups:erasedups  
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
345
27.01.2020, 19:27
  • 1
    Проблема с этим решением PROMPT_COMMAND состоит в том что числа для каждого объекта истории изменения после каждой команды :(. Например, при вводе истории и 1) ls 2), комната, затем Вы делаете! 1 для повторения 1 число истории могло бы изменить и могло бы выполнить команду комнаты... –  Chris Kimpton 07.11.2012, 14:28
  • 2
    Когда я делаю это, другие уже открытые терминалы не имеют последней вводимой команды, когда я нажимаю 'Up', пока я не дам команду в том терминале - это ожидается? Если так, есть ли способ действительно изменить историю других терминалов немедленно? –  Suan 19.12.2012, 04:15
  • 3
    @Suan, это кажется правильным мне на основе команд. Я нашел, что мы можем дать пустую команду (просто нажимают клавишу Enter) заставить историю обновлять. –  sage 10.04.2013, 21:13
  • 4
    На самом деле history -a (...) не инициировал стирающиеся дубликаты согласно этому ответу на историю Bash вопроса: “ignoredups” и “erasedups”, устанавливающий конфликт с общей историей через сессии. Этот ответ также дает последовательность history -<option> команды, который работает с HISTCONTROL=ignoredups:erasedups установка. –  Piotr Dobrogost 29.02.2016, 22:49
  • 5
    Нет никакой причины для export HISTCONTROL и PROMPT_COMMAND переменные: Вы определяете их в .bashrc таким образом, они будут определены в каждой оболочке (даже в неинтерактивных, который также расточителен). –  dolmen 21.06.2016, 17:43

Я могу предложить фиксацию для той последней: удостоверьтесь, что огибающий переменный HISTCONTROL не указывает "ignorespace" (или "ignoreboth").

Но я чувствую Вашу боль с несколькими параллельными сессиями. Это просто не обрабатывается хорошо в ударе.

7
27.01.2020, 19:27

Чтобы сделать это, необходимо будет добавить две строки к Вашему ~/.bashrc:

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

От man bash:

Если опция оболочки histappend включена (см. описание shopt под SHELL ВСТРОЕННЫЕ КОМАНДЫ ниже), строки добавляются в файл истории, иначе файл истории перезаписывается.

17
27.01.2020, 19:27

Я не знаю ни о каком способе использовать bash. Но это - одна из самых популярных функций zsh.
Лично я предпочитаю zsh bash таким образом, я рекомендую пробовать его.

Вот часть моего .zshrc это имеет дело с историей:

SAVEHIST=10000 # Number of entries
HISTSIZE=10000
HISTFILE=~/.zsh/history # File
setopt APPEND_HISTORY # Don't erase history
setopt EXTENDED_HISTORY # Add additional data to history like timestamp
setopt INC_APPEND_HISTORY # Add immediately
setopt HIST_FIND_NO_DUPS # Don't show duplicates in search
setopt HIST_IGNORE_SPACE # Don't preserve spaces. You may want to turn it off
setopt NO_HIST_BEEP # Don't beep
setopt SHARE_HISTORY # Share history between session/terminals
46
27.01.2020, 19:27

Можно использовать history -a для добавления истории текущей сессии к histfile затем используйте history -r на других терминалах для чтения histfile. 

9
27.01.2020, 19:27

При необходимости в ударе или zsh истории, синхронизирующей решение, которое также решает проблему ниже, то посмотрите его по http://ptspts.blogspot.com/2011/03/how-to-automatically-synchronize-shell.html

Проблема следующая: у Меня есть два окна A оболочки и B. В окне A оболочки я работаю sleep 9999, и (не ожидая сна для окончания) в окне B оболочки я хочу смочь видеть sleep 9999 в истории удара.

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

10
27.01.2020, 19:27
  • 1
    Это - хорошее решение, но я получил несколько вопросов все же. 1. Я могу использовать исходный .bash_history файл, я не хочу другой файл истории удара, существовавший в моих 2$HOME. Можете быть Вы, должен считать набор GitHub repo для этого. –  weynhamz 15.08.2012, 13:23
  • 2
    Кажется, что рычаг отладки конфликтуется с bashdb, следовать вывод каждый раз, когда я запускаю сессию удара'. '' отладчик удара, bashdb, Copyright 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 выпуска 4.2-0.8 Rocky Bernstein Это - бесплатное программное обеспечение, охваченное Генеральной общедоступной лицензией GNU, и добро пожаловать изменить его и/или распределить копии его при определенных условиях. ** Внутренняя ошибка отладки _Dbg_is_file (): удар пустого указателя аргумента файла: _Dbg_filenames [$fullname]: плохо выстройте нижний' '' –  weynhamz 15.08.2012, 13:28
  • 3
    @Techlive Zheng: 1. Исходный .bash_history сознательно не поддерживается, потому что .merged_bash_history использует другой формат файла, поэтому в случае, если .merged_bash_history не удается загрузиться правильно, колотить, случайно не ударит накопленную историю. Устойчивость дизайном, будет сохранен, как. 2. GitHub repo является хорошей идеей в целом, но у меня нет времени, чтобы поддержать, что для этого проекта, таким образом, я не делаю его. - Да, это конфликтует с bashdb, и нет никакого легкого решения (они используют те же рычаги). Я не планирую работать над фиксацией, но я принимаю патчи. –  pts 15.08.2012, 13:45
  • 4
    Хорошо, спасибо. Я придумал много простой и лучший sulotion. –  weynhamz 17.08.2012, 12:33
  • 5
    @TechliveZheng: Вы совместно использовали бы свое простое и лучшее решение с нами, таким образом, все мы можем извлечь уроки из него? (Если так, добавьте ответ на вопрос.) –  pts 17.08.2012, 15:21

Вот моя попытка совместного использования истории сессии Bash. Это включит совместное использование истории между сессиями удара способом, как которые счетчик истории не становится перепутанным и расширение истории !number будет работать (с некоторыми ограничениями).

Используя версию 4.1.5 Bash в соответствии с Ubuntu 10.04 LTS (Ясный Lynx).

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
    builtin history -a         #1
    HISTFILESIZE=$HISTSIZE     #2
    builtin history -c         #3
    builtin history -r         #4
}

history() {                  #5
    _bash_history_sync
    builtin history "$@"
}

PROMPT_COMMAND=_bash_history_sync

Объяснение:

  1. Добавьте справедливую вводимую строку к $HISTFILE (значение по умолчанию .bash_history). Это вызовет $HISTFILE вырасти одной строкой.

  2. Установка специальной переменной $HISTFILESIZE к некоторому значению заставит Bash усекать $HISTFILE быть не более, чем $HISTFILESIZE строки путем удаления самых старых записей.

  3. Очистите историю рабочей сессии. Это уменьшит счетчик истории суммой $HISTSIZE.

  4. Считайте содержание $HISTFILE и вставьте их в к текущей под управлением истории сессии. это повысит счетчик истории суммой строк в $HISTFILE. Обратите внимание что количество строки $HISTFILE не обязательно $HISTFILESIZE.

  5. history() функционируйте переопределяет встроенную историю, чтобы удостовериться, что история синхронизируется, прежде чем она будет отображена. Это необходимо для расширения истории числом (больше об этом позже).

Больше объяснения:

  • Шаг 1 гарантирует, что команда от текущей рабочей сессии записана в глобальный файл истории.

  • Шаг 4 гарантирует, что команды от других сессий вкладывают чтение к текущей истории сессии.

  • Поскольку шаг 4 повысит счетчик истории, мы должны уменьшить счетчик в некотором роде. Это сделано на шаге 3.

  • На шаге 3 счетчик истории уменьшается $HISTSIZE. На шаге 4 счетчик истории повышен количеством строк в $HISTFILE. На шаге 2 мы удостоверяемся что количество строки $HISTFILE точно $HISTSIZE (это означает это $HISTFILESIZE должен совпасть с $HISTSIZE).

Об ограничениях расширения истории:

При использовании расширения истории числом необходимо всегда сразу искать число перед использованием его. Это не означает дисплея подсказки удара между поиском числа и использованием его. Это обычно означает, не входят и никакой ctrl+c.

Обычно, после того как у Вас есть больше чем одна сессия Bash, нет никакой гарантии вообще, что расширение истории числом сохранит свое значение между двумя дисплеями подсказки Bash. Поскольку, когда PROMPT_COMMAND выполняется история от всех других сессий Bash интегрируется в истории текущей сессии. Если какая-либо другая сессия удара будет иметь новую команду затем, то числа истории текущей сессии будут отличаться.

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

Обычно я использую расширение истории числом как это

$ history | grep something #note number
$ !number

Я рекомендую использовать следующие опции Bash.

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

Странные ошибки:

Выполнение команды истории, переданной по каналу к чему-либо, закончится, которые управляют, чтобы быть перечисленными в истории дважды. Например:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

Все будут перечислены в истории дважды. Я понятия не имею почему.

Идеи для улучшений:

  • Измените функцию _bash_history_sync() таким образом, это не выполняется каждый раз. Например, это не должно выполняться после a CTRL+C на подсказке. Я часто использую CTRL+C отбрасывать долгую командную строку, когда я решаю, что не хочу выполнять ту строку. Иногда я должен использовать CTRL+C остановить сценарий завершения Bash.

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

120
27.01.2020, 19:27
  • 1
    Почему не "история-n" (перезагружают строки, не уже загруженные) вместо "истории-c; история-r"? –  Graham 14.09.2011, 23:40
  • 2
    @Graham: Я не хотел использовать history -n потому что это портит счетчик истории. Кроме того, я нашел history -n быть слишком ненадежным. –  lesmana 16.09.2011, 15:02
  • 3
    Один недостаток: Команды с многострочными строками обычно все еще сохраняются на текущей сессии. С этим приемом они разделяются на отдельные строки немедленно. Используя-n для-c-r не помогает, ни один не делает cmdhist или lithist. Я не думаю, что существует обходное решение в этой точке. –  Jo Liss 01.02.2012, 14:30
  • 4
    После попытки этого некоторое время, я на самом деле нашел то выполнение только history -a, без -c и -r, лучше мудрый удобством использования (хотя это не что вопрос, который задают). Это означает команды, которые Вы выполняете, доступны немедленно в новых оболочках даже прежде, чем выйти из текущей оболочки, но не в параллельном выполнении оболочек. Таким образом, Стрелка все еще всегда выбирает последние управляемые команды текущей сессии, которую я нахожу намного менее сбивающими с толку. –  Jo Liss 04.02.2012, 17:15
  • 5
    исключительно хороший ответ, это работает надежно в отличие от более общей "истории-a; история-n" –  RichVel 13.01.2013, 00:07

Можно отредактировать подсказку Bash для выполнения "истории-a" и "истории-r" что предложенный Muerr:

savePS1=$PS1

(в случае, если Вы портите что-то, которое почти гарантируется),

PS1=$savePS1`history -a;history -r`

(обратите внимание, что это обратные галочки; они выполнят историю-a и историю-r на каждой подсказке. Так как они не производят текста, Ваша подсказка будет неизменна.

После того как у Вас есть своя переменная PS1, настраивает способ, которым Вы хотите, устанавливаете ее постоянно она в Вашем ~/.bashrc файл.

Если Вы хотите вернуться к своей исходной подсказке при тестировании сделайте:

PS1=$savePS1

Я сделал основное тестирование на этом, чтобы гарантировать, чтобы оно отсортировало работ, но не могло говорить ни с какими побочными эффектами от выполнения history -a;history -r на каждой подсказке.

11
27.01.2020, 19:27
  • 1
    работает лучше, чем мое. Я теперь использую его решение в своем .bashrc. –   14.10.2009, 01:28

Так, это - все мое связанное с историей .bashrc вещь:

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Протестированный с ударом 3.2.17 на Mac OS X 10.5, колотите 4.1.7 на 10,6.

254
27.01.2020, 19:27
  • 1
    Хм.. Это уничтожает способность использовать $! 34, поскольку числа команды изменяют каждую подсказку. Существует ли обходное решение @Davide @Schof @kch? –   17.03.2010, 21:33
  • 2
    Используйте это для получения бесконечной истории: колотите вечную историю. ОДНАКО это дополнительно к коду выше, так как он не будет перезагружен автоматически. –   17.02.2011, 07:36
  • 3
    К вашему сведению Ни одно из решений, упомянутых здесь, не может решить следующую проблему. У меня есть два окна A оболочки и B. В окне A оболочки я работаю sleep 9999, и (не ожидая сна для окончания) в окне B оболочки я хочу смочь видеть sleep 9999 в истории удара. решение kch's –  pts 25.03.2011, 15:43
  • 4
    @pts я также стремился к живому поведению, но затем я понял это, более удобен иметь терминальные определенные истории, которые делают работу над разными вещами в различных терминалах легче. Я нашел, что это было очень полезно: stackoverflow.com/questions/338285/#answer-7449399 На основе этого, я сделал меня псевдонимом названный href это обновляет историю моего текущего терминала немедленно и очищает файл истории в процессе. Каждый раз, когда я открываю новый терминал, та очистка/синхронизация выполняется в моем bashrc файле, таким образом, новый терминал имеет последнюю историю. Я использую это наряду с history -a –  trusktr 16.10.2012, 18:56
  • 5
    Нет никакой причины для export переменные: Вы определяете их в .bashrc таким образом, они будут определены в каждой оболочке (даже в неинтерактивных, который также расточителен) –  dolmen 21.06.2016, 17:44

Вот альтернатива, которую я использую. Он громоздкий, но это решает проблему, что @axel_c упомянул, где иногда вы можете иметь отдельный экземпляр истории в каждом терминале (один для make, один для мониторинга, один для vim и т. Д.).

Я держу отдельный прилагаемый файл истории, который я постоянно обновляю. У меня есть следующее сопоставлено на горячую клавишу:

history | grep -v history >> ~/master_history.txt

Это добавляет всю историю от текущего терминала в файл, называемый Master_History.txt в вашем доме.

У меня также есть отдельная горячая клавиша для поиска в файле Master History:

cat /home/toby/master_history.txt | grep -i

Я использую CAT | Греп, потому что он оставляет курсор в конце, чтобы войти в мое регулярное выражение. Очень менее уродливый способ сделать это, чтобы добавить пару сценариев на ваш путь для выполнения этих задач, но горячие клавиши работают в моих целях. Я также периодически потянутую историю от других хозяев, на которых я работал, и добавил эту историю для моего файла Master_History.txt.

Всегда приятно быть в состоянии быстро искать и найти это хитрые повторное выражение, которое вы использовали, или что странный Perl One-Liner, который вы придумали 7 месяцев назад.

8
27.01.2020, 19:27

Вот фрагмент от моего .Bashrc и короткие объяснения, где это необходимо:

# The following line ensures that history logs screen commands as well
shopt -s histappend

# This line makes the history file to be rewritten and reread at each bash prompt
PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"
# Have lots of history
HISTSIZE=100000         # remember the last 100000 commands
HISTFILESIZE=100000     # start truncating commands after 100000 lines
HISTCONTROL=ignoreboth  # ignoreboth is shorthand for ignorespace and     ignoredups

HistFaleize и HiSize - это личные предпочтения, и вы можете изменить их в соответствии с вашими вкусами.

-1
27.01.2020, 19:27

Верно, так что, наконец, это меня раздражало чтобы найти достойное решение:

# Write history after each command
_bash_history_append() {
    builtin history -a
}
PROMPT_COMMAND="_bash_history_append; $PROMPT_COMMAND"

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

make
ls -lh target/*.foo
scp target/artifact.foo vm:~/

(Упрощенный пример)

И в другом:

pv ~/test.data | nc vm:5000 >> output
less output
mv output output.backup1

Я бы ни в коем случае не хотел, чтобы команда выполняла быть общим

9
27.01.2020, 19:27

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

# Convert /dev/nnn/X or /dev/nnnX to "nnnX"
HISTSUFFIX=`tty | sed 's/\///g;s/^dev//g'`
# History file is now .bash_history_pts0
HISTFILE=".bash_history_$HISTSUFFIX"
HISTTIMEFORMAT="%y-%m-%d %H:%M:%S "
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=5000

История теперь выглядит так:

user@host:~# test 123
user@host:~# test 5451
user@host:~# history
1  15-08-11 10:09:58 test 123
2  15-08-11 10:10:00 test 5451
3  15-08-11 10:10:02 history

Файлы выглядят так:

user@host:~# ls -la .bash*
-rw------- 1 root root  4275 Aug 11 09:42 .bash_history_pts0
-rw------- 1 root root    75 Aug 11 09:49 .bash_history_pts1
-rw-r--r-- 1 root root  3120 Aug 11 10:09 .bashrc
6
27.01.2020, 19:27

Я написал скрипт для создания файла истории для каждого сеанса или задачи, который основан на следующем.

        # write existing history to the old file
        history -a

        # set new historyfile
        export HISTFILE="$1"
        export HISET=$1

        # touch the new file to make sure it exists
        touch $HISTFILE
        # load new history file
        history -r $HISTFILE

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

Полный источник: https://github.com/simotek/scripts-config/blob/master/hiset.sh

3
29.04.2021, 01:02

Здесь я отмечу одну проблему с

export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

и

PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"

Если вы запустите source ~/.bashrc, то $PROMPT_COMMAND будет иметь вид

"history -a; history -c; history -r history -a; history -c; history -r"

и

"history -a; history -n history -a; history -n"

Это повторение происходит каждый раз, когда вы запускаете 'source ~/.bashrc'. Вы можете проверить PROMPT_COMMAND после каждого запуска 'source ~/.bashrc', выполнив 'echo $PROMPT_COMMAND'.

Вы можете увидеть, что некоторые команды, очевидно, не работают: "history -n history -a". Но хорошая новость в том, что это все еще работает, потому что другие части все еще формируют правильную последовательность команд (только с некоторыми дополнительными затратами, связанными с повторным выполнением некоторых команд. И не так чисто.)

Лично я использую следующую простую версию:

shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r"

в которой есть большинство функциональных возможностей, но нет таких проблем, о которых говорилось выше.

Еще один момент, на который стоит обратить внимание: на самом деле нет ничего волшебного. PROMPT_COMMAND - это обычная переменная окружения bash. Команды в ней выполняются до того, как вы получите приглашение bash (знак $). Например, ваша PROMPT_COMMAND - "echo 123", и вы запускаете "ls" в терминале. Эффект будет такой же, как при выполнении команды "ls; echo 123".

$ PROMPT_COMMAND="echo 123"

вывод (Так же, как если бы вы запустили 'PROMPT_COMMAND="echo 123"; $PROMPT_COMMAND'):

123

Выполните следующее:

$ echo 3

вывод:

3
123

"history -a" используется для записи команд истории в память в ~/.bash_history

"history -c" используется для очистки команд истории в памяти

"history -r" используется для чтения команд истории из ~/.bash_history в память

См. объяснение команд истории здесь: http://ss64.com/bash/history.html

PS: Как отметили другие пользователи, export не нужен. См: использование export в .bashrc

6
20.08.2021, 13:40

Вот мое усовершенствование ответа @ lesmana . Основное отличие состоит в том, что параллельные окна не разделяют историю. Это означает, что вы можете продолжать работать в своих окнах, не загружая контекст из других окон в текущие окна.

Если вы явно набираете «история» ИЛИ если вы открываете новое окно, вы получаете историю из всех предыдущих окон.

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

# Consistent and forever bash history
HISTSIZE=100000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
}

_bash_history_sync_and_reload() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

history() {                  #5
  _bash_history_sync_and_reload
  builtin history "$@"
}

export HISTTIMEFORMAT="%y/%m/%d %H:%M:%S   "
PROMPT_COMMAND='history 1 >> ${HOME}/.bash_eternal_history'
PROMPT_COMMAND=_bash_history_sync;$PROMPT_COMMAND
7
20.08.2021, 13:40

Porque prefiero la historia infinita que se guarda en un archivo personalizado. Creo esta configuración basada enhttps://stackoverflow.com/a/19533853/4632019:

export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "

export HISTFILE=~/.bash_myhistory
PROMPT_COMMAND="history -a; history -r; $PROMPT_COMMAND"
2
20.08.2021, 13:40

Это работает для ZSH

##############################################################################
# History Configuration for ZSH
##############################################################################
HISTSIZE=10000               #How many lines of history to keep in memory
HISTFILE=~/.zsh_history     #Where to save history to disk
SAVEHIST=10000               #Number of history entries to save to disk
#HISTDUP=erase               #Erase duplicates in the history file
setopt    appendhistory     #Append history to the history file (no overwriting)
setopt    sharehistory      #Share history across terminals
setopt    incappendhistory  #Immediately append to the history file, not just when a term is killed
2
20.08.2021, 13:40

Я давно хотел этого, особенно возможность получить команду по тому, где она была запущена, чтобы повторно -выполнить в новом проекте (или найти каталог по команде ). Поэтому я собрал этот инструмент вместе, который сочетает в себе предыдущие решения для хранения глобальной истории CLI с интерактивным инструментом поиска под названием percol (, сопоставленным с C^R ). Это все еще гладко на первой машине, которую я начал использовать, теперь с> 2-летней историей CLI.

Это не влияет на локальную историю командной строки в том, что касается клавиш со стрелками, но позволяет довольно легко получить доступ к глобальной истории (, которую вы также можете сопоставить с чем-то другим, кроме C^R)

2
20.08.2021, 13:40

Вот решение, которое не смешивает истории отдельных сессий!

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

Вот основная логика:

# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
  history -a ${HISTFILE}.$$
  history -c
  history -r
  for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$\$"`; do
    history -r $f
  done
  history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'

# merge session history into main history file on bash exit
merge_session_history () {
  cat ${HISTFILE}.$$ >> $HISTFILE
  rm ${HISTFILE}.$$
}
trap merge_session_history EXIT

Полное решение, включая некоторые меры безопасности и оптимизацию производительности, см. в этой сути .

3
20.08.2021, 13:40

Это не совсем ответ на вопрос, или это так. Это зависит от того, как вы на это смотрите. Судя по всему, bashне поддерживает это из коробки. И не то чтобы просто так, если подумать. Для реализации этого он должен записывать в файл истории (, не дублируя его )перед выполнением каждой команды, и читать каждый раз, когда ему требуется история. Как вы думаете, файла будет достаточно? Ну, вы можете использовать блокировки, но, учитывая, что некоторая индексация будет в порядке, должно быть проще просто использовать какую-то базу данных. И вдобавок ко всему, вы действительно хотите, чтобы у всех оболочек была общая история? Разве вы не используете Up для повторного выполнения команды из текущей оболочки? Вы не используете sudo !!?

Так что я предлагаю ПОЦЕЛУЙ (быть практичным):

shopt -s histappend
HISTCONTROL=erasedups

Если вы хотите выполнить команду в другой оболочке, выполните history -a, затем в другой оболочке history -n, и все готово.

1
20.08.2021, 13:40

Теги

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