77

Есть ли способ определить неограниченную историю в Bash?

4 ответа4

76

поместите это в .bashrc:

export HISTFILESIZE=
export HISTSIZE=

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

Из "man bash":

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

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

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

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

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

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

40

(опубликовать мой ответ с 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.

8

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

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

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

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

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

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

фон

При интерактивном запуске, если $HISTFILESIZE установлен в число, bash $HISTFILE до этого числа. На интерактивном закрытии, если опция оболочки histappend установлен, Баш добавляет $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
3

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .