Неограниченная история Bash [закрыто]

350

Я хочу, чтобы мой .bash_historyфайл был неограниченным. Например, я всегда могу вернуться и посмотреть, как я что-то построил / сконфигурировал, или какова была эта изящная команда, или как какая-то команда сломала что-то несколько недель назад. Как мне изменить этот параметр?

Фрэнсис Хаарт
источник
1
Bash это язык программирования, а это не о программировании?
NeilG

Ответы:

307

Установите HISTSIZEи HISTFILESIZEв .bashrc пустую строку:

HISTSIZE= 
HISTFILESIZE=

В Bash 4.3 и позже вы также можете использовать HISTSIZE=-1 HISTFILESIZE=-1:

n.  Setting HISTSIZE to a value less than zero causes the history list to be
    unlimited (setting it 0 zero disables the history list).

o.  Setting HISTFILESIZE to a value less than zero causes the history file size
    to be unlimited (setting it to 0 causes the history file to be truncated
    to zero size).
LRI
источник
12
(export PROMPT_COMMAND = 'history -a') может немедленно сбрасывать команды для удаления истории.
Жестокость
3
Установка HISTSIZE= HISTFILESIZE=приводит к полному отключению истории bash, по крайней мере, для меня.
Филипп Людвиг
5
Установка @PhilippLudwig HISTSIZE=-1 HISTFILESIZE=-1отключила мою историю, в то время как HISTSIZE= HISTFILESIZE=сделала трюк. CentOS 7 здесь.
Seether
1
@PhilippLudwig Я думаю, что лучше, чем HISTSIZE= HISTFILESIZE=выexport HISTSIZE= export HISTFILESIZE=
Matzz
3
@Seether Ответ ясно гласит: «В bash 4.3 и позже ...». CentOS 7 имеет bash 4.2.x.
villapx
426

После многих больших, уродливых итераций и странных крайних случаев за эти годы у меня теперь есть краткий раздел моего .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".
# http://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
источник
1
@AquariusPower - Попробуйте , что именно выше, делают HISTFILESIZE=и HISTSIZE=пустым вместо -1, и убедитесь , что у вас нет никаких других заявлений тех Params в .bashrc или .bash_profile или .profile.
Фотинакис
2
виновник, у .bashrcменя была эта настройка после другого файла, загруженного .bashrc ..., теперь работает! Спасибо!
Водолей Сила
10
Добавьте его в мою стандартную систему bash, и добавление текущей истории также хорошо, поэтому после настройки запуститеcat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud
2
Чтобы сохранить историю, инициализируйте файл истории с вашей текущей историей.
Артур
3
Большое спасибо - тот факт , что установка HISTFILESIZE(и , возможно HISTSIZE) будет принимать непосредственное влияние не может быть переоценена .
Атти
37

Как упомянул выше Йорг Бейер HISTSIZEи HISTFILESIZEявляются ключевыми.

Кроме того, вы обязательно должны проверить переменную среды HISTCONTROL, которая позволяет вам делать классные вещи, такие как не хранить дублирующиеся команды истории ( HISTCONTROL=erasedups). Нет смысла иметь неограниченную историю, если вам приходится просматривать сотни строк cd ..или что-то подобное.

Ссылки: здесь и работа с bash history . Часто задаваемые вопросы по bash Variable также стоит посмотреть .

simont
источник
14
Эти строки cd дают вам контекст для выданных команд. Они на самом деле невероятно полезны. Я не могу понять, почему кто-то когда-либо захочет удалить их, если только вы не используете историю как-будто, просматривая ее по одной команде за раз.
иконоборчество
@simont Я также использую опцию ignorespace с HISTCONTROL, затем использую ее для всего, что я не хочу записывать в историю, например, для паролей.
bigtunacan
6
Поддержание порядка строк очень полезно, если вы повторно используете последовательности команд. Например, Ctrl-rSomechars Ctrl-o Ctrl-o Ctrl-o Ctrl-o. Вот почему я храню дубликаты в истории.
Стефан Гурихон
1
@ StéphaneGourichon для чего Ctrl-o?
Ciprian Tomoiagă
4
@ CiprianTomoiagă Ctrl-oзапускает команду в командной строке и сразу показывает команду сразу после предыдущей в истории. Одним из преимуществ является то, что после использования Ctrl-rдля поиска старой команды (возможно, используя стрелки вверх и вниз для перехода к соседним командам в истории), достаточно удерживать Ctrlнажатой и нажимать oнесколько раз, чтобы снова запустить предыдущую серию команд, даже в бесконечном цикле если вы хотите. Смотрите также GNU Readline - Википедия
Стефан Гурихон
22

Здесь есть (по крайней мере) два релевантных варианта env:

  • HISTSIZE: количество записей в файле истории
  • HISTFILESIZE: количество строк в файле истории

Я думаю, что мы можем согласиться с тем, что термин « неограниченный» часто совпадает с очень большим (или у вас есть неограниченное хранилище файлов?). Так что просто установите значения очень большие.

Йорг Бейер
источник
23
«Следует отметить, что 1000000000 равняется бесконечности только для очень малых значений бесконечности. - sepp2k» лол. да, я доволен маленькими значениями бесконечности (скажем, месяц частого использования терминала).
Фрэнсис Хаарт
6
месяц частого конечного использования - это ничтожно малая доля бесконечности. Я бы сказал, что время жизни при частом использовании терминала очень мало, очень мало. Но время частого использования терминала достаточно для моей истории оболочки. ;)
иконоборчество
2
Старые версии zsh по крайней мере потерпят крах, если вы установите слишком большое значение HISTSIZE и / или HISTFILESIZE, потому что оно пытается предварительно выделить достаточно памяти. Это стало актуальным при запуске инструментов, которые используют zsh в качестве оболочки (например, dbx).
Брайан Ванденберг