Необмежена історія башів [закрита]


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).

12
.
cruelcage

3
Встановлення HISTSIZE= HISTFILESIZE=результатів повністю відключить історію баш, принаймні для мене.
Philipp Ludwig

5
Налаштування @PhilippLudwig HISTSIZE=-1 HISTFILESIZE=-1відключило мою історію, а HISTSIZE= HISTFILESIZE=трюк. Тут CentOS 7.
Сет

1
@PhilippLudwig Я думаю, а не HISTSIZE= HISTFILESIZE=слідexport HISTSIZE= export HISTFILESIZE=
Матзз

3
@Seether У відповіді чітко сказано: "У програмі 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 %%", щоб уникнути написання історії, вам потрібно буде видалити його вручну.

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


1
@AquariusPower - Спробуйте, що саме зазначено вище, зробіть поле HISTFILESIZE=та HISTSIZE=порожнє замість -1 та переконайтесь, що у вас немає інших декларацій цих парам у .bashrc або .bash_profile чи .profile.
fotinakis

2
Винуватець, у .bashrcмене було це налаштування після іншого файлу, завантаженого .bashrc ..., зараз працює! Дякую!
Сила Водолія

10
Додайте його в мою стандартну баш-систему, і додавання поточної історії також приємно, тому після конфігурації запустітьcat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud

2
Щоб зберегти історію історії, ініціалізуйте файл історії з вашою поточною історією.
Артур

3
Велике спасибі - той факт, що налаштування HISTFILESIZE(і можливо HISTSIZE) набуде негайного ефекту, неможливо переоцінити .
Attie

37

Як Йорг Бейер згадувалося вище, HISTSIZEі HISTFILESIZEє ключовими.

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

Посилання: тут , і робота з історією баш . Також варто переглянути перегляд "bash Variable FAQ" .


14
Ці рядки CD дають вам контекст для виданих команд. Вони насправді неймовірно корисні. Я не можу зрозуміти, чому хто-небудь хотів би їх видалити, якщо єдиний спосіб, коли ви коли-небудь використовувати історію, - це перезаписування по одній команді за раз.
іконоборство

@simont Я також використовую параметр ignorespace з HISTCONTROL, тоді використовую це для всього, що я не хочу писати в історію, наприклад паролів.
bigtunacan

6
Утримувати рядки в порядку дуже корисно, якщо ви повторно використовуєте послідовності команд. Наприклад, Ctrl-rдеякі 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 - Wikipedia
Stéphane Gourichon

22

Тут є (принаймні) дві відповідні програми:

  • HISTSIZE: кількість записів у файлі історії
  • HISTFILESIZE: кількість рядків у файлі історії

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


23
"Слід зазначити, що 1000000000 дорівнює нескінченності лише для дуже малих значень нескінченності. - sepp2k" lol. так, я задоволений невеликими значеннями нескінченності (скажімо, місяць частого використання терміналу).
Френсіс Хаарт

6
місяць частого термінального використання - це нескінченно мала частина нескінченності. Я б сказав, що життя частого використання терміналу прирівнюється до дуже-дуже малої величини нескінченності. Але життя частого використання терміналу досить добре для моєї історії оболонок. ;)
іконоборство

2
Старіші версії zsh принаймні завершаться, якщо ви встановите HISTSIZE та / або HISTFILESIZE занадто великі, оскільки він намагається заздалегідь виділити достатню кількість пам'яті. Це стало актуальним при запуску інструментів, які використовують zsh як оболонку (наприклад, dbx).
Брайан Ванденберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.