Как: Неограниченная история Bash / shell?

Ответы:

82

Добавьте это к вашему .bashrc(Linux) или .bash_profile(MacOS):

export HISTFILESIZE=
export HISTSIZE=

Вот и все, неограниченная история. На данный момент у меня 27000 записей :)

От man bash:

Если HISTFILESIZEне установлено, усечение не выполняется.

Это означает, .bash_historyчто никогда не усекается

HISTSIZEТо же самое относится и к , хотя я не смог найти это документально.

Еще одна полезная функция, которую я собираюсь попробовать, это:

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

export HISTTIMEFORMAT="%F %T "

Дайте мне знать, если вы уже попробовали это ...

Morgenrot
источник
3
На самом деле это не работает во многих случаях, и история bash все еще усекается. Смотрите мой ответ ниже для более полного решения.
Фотинакис
2
Предупреждение: это вызывает головную боль gdb; если вы установите HISTSIZEпеременную, она будет восприниматься как 0, что полностью отключит размер истории.
Маттео Италия
2
примечания: вам не нужно export, HISTFILESIZEэто количество строк (не байтов), и усечение файла истории происходит при установке переменнойHISTFILESIZE (и при выходе из оболочки). Так что не устанавливайте его дважды в вашем конфигурационном файле с другими значениями ...
vaab
@vaab: если я не экспортирую HISTFILE, я не могу увидеть, что в моем историческом файле используется «echo $ HISTFILE» в подоболочках, поэтому, хотя в этом нет необходимости, он может быть полезен и не причиняет вреда, который я могу обнаружить.
Джефф Лирман
41

(репост моего ответа с https://stackoverflow.com/a/19533853/128597 )

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

Во-первых, вы должны закомментировать или удалить этот раздел вашего .bashrc (по умолчанию для Ubuntu). Если вы этого не сделаете, то определенные среды (например, запущенные screenсеансы) будут все еще обрезать вашу историю:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

Во-вторых, добавьте это в конец вашего .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Примечание: каждая команда пишется сразу после запуска, поэтому, если вы случайно вставите пароль, вы не сможете просто «убить -9 %%», чтобы избежать записи в историю, вам придется удалить его вручную.

Также обратите внимание, что каждый сеанс bash будет загружать полный файл истории в память, но даже если ваш файл истории увеличивается до 10 МБ (что займет много времени), вы не заметите большого влияния на время запуска bash.

fotinakis
источник
4
Файл истории обрезается, когда вы устанавливаете HISTFILESIZE, поэтому вы должны удалить любой случай такого события, кроме того, который вы хотите. Он также будет усечен при выходе из оболочки (но это ожидается). И тебе не нужно export.
Вааб
3
@vaab Если вы не экспортируете, выполнение чего-то подобного bash --norcснова усечет историю.
Юнвэй Ву
1
Я использую, export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"чтобы хранить историю оболочки отдельно для каждой сессии (на основе имени хоста и имени tty). Конечно, я должен сначала создать каталог ~ / hist.
Джефф Лирман
2
Обратите внимание, что вы можете проверить значение PROMPT_COMMAND и не добавлять его вслепую, так как это приведет к сумасшедшим вещам в вашей системе. Проверка нуля или, что еще лучше, поиск расширения переменной оболочки, вероятно, безопаснее.
dragon788
3
Я использую это, чтобы избежать проблемы @ dragon788, на которую ссылаются:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Брайан Ванденберг
9

Включить в ~ / .bashrc :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

Этот ответ удовлетворяет следующим критериям:

  1. отдельная основная история (ни одна сессия не может прервать вашу историю)

  2. автоматическое написание истории (без горячих клавиш)

  3. нечастые записи (не добавляются после каждой команды)

фон

При интерактивном запуске, если $HISTFILESIZEзадано число, bash усекается $HISTFILEдо этого числа. При интерактивном закрытии, если установлена ​​опция оболочки histappend, bash добавляет $HISTSIZEстроки $HISTFILE, в противном случае перезаписывает $HISTFILE.

советы для OSX (Терминал)

Каждый раз, когда вкладка создается в Терминале, ~/.bash_profileона читается, что означает, что bash не продолжает читать вашу ~/.bashrc. Добавьте следующую строку в ваш ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

советы по экрану

Если вы используете экран, ваш файл конфигурации ~ / .screenrc. Если вы хотите, чтобы экран записывал историю, вам просто нужно настроить ее на использование оболочки входа в систему, которая будет исходить из ваших файлов запуска bash (и записывать вашу историю).

# use bash, make it a login shell
defshell -bash
cdosborn
источник
3

Другая концепция (может быть неприменима), но вы можете иметь unlimitedисторию при использовании shell-sink .

ChristopheD
источник