Nieograniczona historia w Zsh

42

W zshChcę mieć nieograniczoną historię. Ustawiam HISTSIZE=, który działa bash. Teraz importuję starą historię

mv old_history .history

który jest dość duży

wc -l .history
43562 .history

Jeśli teraz zamknę i zacznę od zshnowa, zobaczę

wc -l .history
32234 .history

Czy nie mogę mieć nieograniczonej historii zsh?

pfnuesel
źródło
Wydaje się, że zsh działa inaczej niż bash wiki.gentoo.org/wiki/Zsh/Guide#History Ten przewodnik powinien pomóc ci w historii zsh.
aurelien

Odpowiedzi:

50

Istnieje limit i możliwości twoich maszyn.

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.

Z listy mailingowej ZSH :

Powinieneś określić, ile masz pamięci, ile z niej możesz pozwolić na zajęcie się historią (AFAIK jest zawsze w pełni załadowany do pamięci) i postępować odpowiednio. Usunięcie limitu nie jest mądrzejsze, ponieważ daje wyobrażenie o tym, że nie ma limitu, a zawsze jest ograniczone dostępnymi zasobami.

Lub jeśli nie uważasz, że kiedykolwiek napotkasz problem z wyczerpaniem zasobów, możesz po prostu ustawić HISTSIZE na LONG_MAX od limitów. H: jest to maksymalna liczba, jaką może mieć HISTSIZE.

Co wyjaśnia rozwiązanie Gentoo:

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

Historia nie zostanie zapisana bez następującego polecenia:

export SAVEHIST=$HISTSIZE

Aby zapobiec zapisywaniu zduplikowanych wpisów w historii (takich jak ls -l wprowadzanych wiele razy podczas sesji pojedynczej powłoki), możesz ustawić opcję hist_ignore_all_dups:

setopt hist_ignore_all_dups

Przydatna sztuczka, aby zapobiec zapisywaniu poszczególnych wpisów w historii, poprzedzając je przynajmniej jedną spacją.

setopt hist_ignore_space
aurelien
źródło
Nie rozumiem, jak to odpowiada na moje pytanie. Rozmiar mojego pliku historii to 683 kB, na pewno nie za duży dla mojej pamięci?
pfnuesel
3
użytkownik $ export HISTSIZE = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 będzie poza możliwościami twojego komputera. Musisz ustawić tę liczbę, aby jak najlepiej dopasować ją do swoich życzeń i możliwości komputera.
aurelien
Mogę to ustawić 50000, ale to nie rozwiąże mojego problemu.
pfnuesel
1
Twoje pytanie brzmi: czy nie mogę mieć nieograniczonej historii w Zsh? Autor ZSH odpowiada Nie, ale możesz ustawić go tak, jak chcesz. Gentoo wyjaśni dokładnie, jak to zrobić.
aurelien
1
żadne z tych rozwiązań nie działa w Zsh. Nadal odcina to po około tygodniu lub dwóch. Radziłem sobie z tym problemem od lat i jest to takie absurdalne. W końcu użyłem do tego logrotate.
kristopolous
17

Musisz ustawić oba HISTSIZEi SAVEHIST. Wskazują odpowiednio, ile wierszy historii należy zachować w pamięci i ile wierszy należy zachować w pliku historii.

Nie sądzę, aby zsh miał ustawienie, które oznacza „nieskończony”, ale ze wszystkich praktycznych powodów, miliard jest nieskończony, podczas gdy na komputerach 32-bitowych może być reprezentowany przez maszynę.

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE
Gilles „SO- przestań być zły”
źródło
Czy powinienem się martwić, że tak duża liczba linii w pamięci spowolni mój komputer?
becko
7
W swoim życiu nie będziesz pisać wystarczająco dużo linii historii, aby spowolnić komputer z 2010 roku.
Gilles „SO- przestań być zły”
1

Miałem problem z ograniczeniem historii, 10000dopóki nie zdałem sobie sprawy, że oh-my-zsh ustala swoje HISTSIZEi SAVEHISTwartości. TL; DR, upewnij się, że umieściłeś linie na dole twojego .zshrc.

Matthew D. Scholefield
źródło
0

Problem nie zshdotyczył mojej .zshrc, ale mojej historii. Było trochę nieparzystych wpisów

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

które były zdezorientowane zshi wszystko po tych wpisach zostało obcięte. Nie wiem, jaki znak ^@odpowiada, ani jak te wpisy trafiły do ​​mojej historii, ale usunięcie ich rozwiązało problem.

pfnuesel
źródło
z którego terminala i edytora korzystasz?
aurelien
ponieważ pytanie brzmi: czy to wróci jeszcze raz?
aurelien
terminologya vim.
pfnuesel
1
^@jest \0znakiem ASCII NUL ( ).
muru
6
Znaki ^ @ ^ @ ^ @ ^ @ są zerowe i często pojawiają się, gdy dwa programy próbują pisać do tego samego pliku w tym samym czasie i nie używają zapisów atomowych (np. Zapisy buforowane) lub blokowania . Może to być spowodowane uszkodzeniem systemu plików, złym przywróceniem z kopii zapasowej lub podobnym.
user222658