Есть ли способ определить неограниченную историю в Bash?
4 ответа
поместите это в .bashrc:
export HISTFILESIZE=
export HISTSIZE=
Вот и все, неограниченная история. На данный момент у меня 27000 записей :)
Из "man bash":
Если
HISTFILESIZE
не установлен, усечение не выполняется.
Это означает, что .bash_history никогда не усекается
То же самое относится и к HISTSIZE, хотя я не смог найти это документально.
Еще одна полезная функция, которую я собираюсь попробовать, это:
Если установлена переменная
HISTTIMEFORMAT
времени записываются в файл истории, отмеченные символом комментария истории, поэтому они могут сохраняться в сеансах оболочки.
Дайте мне знать, если вы уже попробовали это ...
(опубликовать мой ответ с 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.
Включить в ~/.bashrc:
# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=
Этот ответ удовлетворяет следующим критериям:
отдельная основная история (никакая сессия не может прервать вашу историю)
автоматическое написание истории (без горячих клавиш)
нечастые записи (не добавляются после каждой команды)
фон
При интерактивном запуске, если $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
Другая концепция (может быть неприменима), но вы можете иметь unlimited
историю при использовании раковины.