Як: Необмежена історія башів / оболонок?


Відповіді:


82

Додайте це до свого .bashrc(Linux) або .bash_profile(MacOS):

export HISTFILESIZE=
export HISTSIZE=

Там ви йдете, необмежена історія. На даний момент у мене 27000 записів :)

Від man bash:

Якщо HISTFILESIZEне встановлено, усічення не виконується.

Це означає .bash_history, що ніколи не врізається

Також те саме стосується HISTSIZE, хоча я не міг знайти це документально підтвердженим.

Ще одна акуратна особливість, яку я спробую спробувати:

Якщо HISTTIMEFORMATзмінна встановлена, часові позначки записуються у файл історії, позначені символом коментаря до історії, тому вони можуть зберігатися протягом сеансів оболонки, як-от наступного:

export HISTTIMEFORMAT="%F %T "

Дайте мені знати, якщо ви вже пробували це ...


3
Насправді це не спрацьовує для багатьох випадків, і історія башти все ще стає усіченою. Дивіться мою відповідь нижче для більш повного рішення.
fotinakis

2
Попередження: це викликає головні болі з gdb; якщо встановити HISTSIZEзмінну, вона буде вважати це як 0, тим самим вимкнення розміру історії повністю.
Matteo Italia

2
Примітки: вам не потрібно export, HISTFILESIZEце кількість рядків (не байт), а обрізання файлів історії відбувається, коли ви встановлюєте зміннуHISTFILESIZE (і коли оболонка виходить). Тому не встановлюйте його двічі у вашому конфігураційному файлі з різними значеннями ...
vaab

@vaab: якщо я не експортую HISTFILE, я не можу побачити, що в моєму файлі історій використовується "echo $ HISTFILE" в підрозділах, тому, хоча це не потрібно, воно може бути корисним і не завдає шкоди, яку я можу виявити.
Jeff Learman

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

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


4
Файл історії обрізається, коли ви встановлюєте HISTFILESIZE, тому ви повинні видалити будь-яке виникнення такої події, крім тієї, яку ви хочете. Він також буде усічений на виході оболонки (але це очікується). І вам не потрібно export.
vaab

3
@vaab Якщо ви не експортуєте, то щось подібне bash --norcзнову вріже історію.
Yongwei Wu

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 (термінал)

Кожен раз, коли в Terminal створюється вкладка, ~/.bash_profileчитається, що означає, що баш не продовжує читати ваші ~/.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історію, коли використовуєте раковину .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.