Неограниченная история в зш

42

Во zsh, я хочу иметь неограниченную историю. Я установил HISTSIZE=, который работает в bash. Теперь я импортирую старую историю

mv old_history .history

который довольно большой

wc -l .history
43562 .history

Если я сейчас закроюсь и начну zshснова, я увижу

wc -l .history
32234 .history

Разве я не могу иметь неограниченную историю в zsh?

pfnuesel
источник
zsh, кажется, работает не так, как bash. wiki.gentoo.org/wiki/Zsh/Guide#History это руководство должно помочь вам в истории zsh.
Орельен

Ответы:

51

Существует предел и возможности ваших машин.

HISTFILE="$HOME/.zsh_history"
HISTSIZE=10000000
SAVEHIST=10000000
setopt BANG_HIST                 # Treat the '!' character specially during expansion.
setopt EXTENDED_HISTORY          # Write the history file in the ":start:elapsed;command" format.
setopt INC_APPEND_HISTORY        # Write to the history file immediately, not when the shell exits.
setopt SHARE_HISTORY             # Share history between all sessions.
setopt HIST_EXPIRE_DUPS_FIRST    # Expire duplicate entries first when trimming history.
setopt HIST_IGNORE_DUPS          # Don't record an entry that was just recorded again.
setopt HIST_IGNORE_ALL_DUPS      # Delete old recorded entry if new entry is a duplicate.
setopt HIST_FIND_NO_DUPS         # Do not display a line previously found.
setopt HIST_IGNORE_SPACE         # Don't record an entry starting with a space.
setopt HIST_SAVE_NO_DUPS         # Don't write duplicate entries in the history file.
setopt HIST_REDUCE_BLANKS        # Remove superfluous blanks before recording entry.
setopt HIST_VERIFY               # Don't execute immediately upon history expansion.
setopt HIST_BEEP                 # Beep when accessing nonexistent history.

Из списка рассылки ZSH :

Вы должны определить, сколько у вас памяти, сколько из нее вы можете позволить заняться историей (AFAIK она всегда полностью загружена в память) и действовать соответственно. Снять ограничение не стоит, так как у вас возникает мысль, что ограничения нет, хотя он всегда ограничен доступными ресурсами.

Или, если вы не думаете, что когда-либо столкнетесь с проблемой истощения ресурсов, вы можете просто установить HISTSIZE в LONG_MAX из limit.h: это максимальное число, которое может иметь HISTSIZE.

Что объясняет решение Gentoo:

export HISTSIZE=2000
export HISTFILE="$HOME/.history"

История не будет сохранена без следующей команды:

export SAVEHIST=$HISTSIZE

Чтобы история не записывала повторяющиеся записи (например, ls -l, введенный много раз в течение одного сеанса оболочки), вы можете установить параметр hist_ignore_all_dups:

setopt hist_ignore_all_dups

Полезный прием для предотвращения записи отдельных записей в историю, если им предшествует хотя бы один пробел.

setopt hist_ignore_space
Орельен
источник
Я не понимаю, как это отвечает на мой вопрос. Размер моего файла истории составляет 683 КБ, конечно, не слишком большой для моей памяти?
pfnuesel
3
user $ export HISTSIZE = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 будет из возможностей вашего компьютера. Вы должны установить это число так, чтобы оно максимально соответствовало вашим желаниям и возможностям компьютера.
Орельен
Я могу установить его 50000, но это не решит мою проблему.
pfnuesel
1
Ваш вопрос: не могу ли я иметь неограниченную историю в Zsh? Автор ZSH отвечает Нет, но вы можете установить его по своему желанию. Gentoo объяснил просто правильно, как это сделать.
Орельен
1
ни одно из этих решений не работает в Zsh. Это все еще обрезает примерно через неделю или две. Я имел дело с этой проблемой в течение многих лет, и это так абсурдно. Я наконец использовал logrotate, чтобы сделать это.
Кристополус
17

Вам нужно установить оба HISTSIZEи SAVEHIST. Они указывают, сколько строк истории следует хранить в памяти и сколько строк хранить в файле истории, соответственно.

Я не думаю, что у zsh есть параметр, который означает «бесконечный», но для всех практических целей один миллиард бесконечен, оставаясь машинно-представимым на 32-битных машинах.

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE
Жиль "ТАК - перестань быть злым"
источник
Должен ли я беспокоиться о том, чтобы такое большое количество строк в памяти замедляло работу моего компьютера?
becko
7
Вы не собираетесь набирать достаточное количество строк истории в своей жизни, чтобы замедлить работу ПК 2010 года.
Жиль "ТАК - перестань быть злым"
1

У меня была проблема с ограничением истории, 10000пока я не понял, что oh-my-zsh устанавливает свои собственные значения HISTSIZEи SAVEHISTзначения. TL; DR, не забудьте поставить линии в нижней части вашего .zshrc.

Мэтью Д. Шолфилд
источник
0

Проблема была не с zshмоей .zshrc, а с моей историей. Были некоторые странные записи, такие как

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@#1453692179

что смутило zshи все после того, как эти записи были усечены. Я не знаю, какому персонажу ^@соответствует или как эти записи оказались в моей истории, но удаление их решило проблему.

pfnuesel
источник
какой терминал и редактор вы используете?
Aurelien
потому что вопрос сейчас в том, вернется ли это еще раз позже?
Орельен
terminologyи vim.
pfnuesel
1
^@является \0символом ASCII NUL ( ).
Муру,
6
Символы ^ @ ^ @ ^ @ ^ @ равны нулю, и они часто появляются, когда две программы пытаются записать в один и тот же файл одновременно и не используют атомарные записи (например, они буферизуют записи) или блокируют , Или это может быть вызвано повреждением файловой системы, плохим восстановлением из резервной копии или подобным.
user222658