Cronologia illimitata in zsh


42

In zsh, voglio avere una storia illimitata. Ho impostato HISTSIZE=, che funziona bash. Ora importa una vecchia storia

mv old_history .history

che è piuttosto grande

wc -l .history
43562 .history

Se ora chiudo e ricomincio zsh, vedo

wc -l .history
32234 .history

Non posso avere una cronologia illimitata in zsh?


zsh sembra funzionare diversamente da bash wiki.gentoo.org/wiki/Zsh/Guide#History questa guida dovrebbe aiutarti nella storia di zsh.
aurelien,

Risposte:


51

C'è il limite e le possibilità delle tue macchine.

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.

Dalla mailing list di ZSH :

Dovresti determinare quanta memoria hai, quanta parte puoi permettere di essere occupata dalla cronologia (AFAIK è sempre completamente caricata in memoria) e agire di conseguenza. Rimuovere il limite non è più saggio in quanto ti lascia l'idea che non ci siano limiti mentre è sempre limitato dalle risorse disponibili.

Oppure, se non pensi di avere mai un problema con l'esaurimento delle risorse, puoi semplicemente impostare HISTSIZE su LONG_MAX dai limiti.h: è il numero massimo che HISTSIZE può avere.

Il che spiega la soluzione Gentoo:

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

La cronologia non verrà salvata senza il seguente comando:

export SAVEHIST=$HISTSIZE

Per impedire alla cronologia di registrare voci duplicate (come ls -l immesse più volte durante una singola sessione di shell), è possibile impostare l'opzione hist_ignore_all_dups:

setopt hist_ignore_all_dups

Un trucco utile per impedire che determinate voci vengano registrate in una cronologia precedendole con almeno uno spazio.

setopt hist_ignore_space

Non vedo come questo risponda alla mia domanda. La dimensione del mio file di cronologia è 683 kB, sicuramente non troppo grande per la mia memoria?
pfnuesel,

3
user $ export HISTSIZE = 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 sarà fuori dalle possibilità del tuo computer. Devi impostare quel numero per adattarlo il meglio possibile al tuo desiderio e alle possibilità del computer.
aurelien,

Posso impostarlo su 50000, ma questo non risolverà il mio problema.
pfnuesel,

1
La tua domanda è: Non posso avere una cronologia illimitata in zsh? L'autore di ZSH risponde No ma puoi impostarlo come desideri. Gentoo spiega correttamente come farlo.
aurelien,

1
nessuna di queste soluzioni funziona in zsh. Lo interrompe ancora dopo circa una settimana o due. Ho affrontato questo problema per anni ed è così assurdo. Finalmente ho usato logrotate per farlo.
kristopolous,

17

Devi impostare sia HISTSIZEe SAVEHIST. Indicano quante righe della cronologia tenere in memoria e quante righe conservare nel file della cronologia, rispettivamente.

Non credo che zsh abbia un'impostazione che significa "infinito", ma per tutti gli scopi pratici, un miliardo è infinito, pur rimanendo rappresentabile dalla macchina su macchine a 32 bit.

HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE

Dovrei preoccuparmi di mantenere un numero così elevato di linee in memoria che rallentano il mio computer?
becko,

7
Non scriverai abbastanza linee di cronologia nella tua vita per rallentare un PC del 2010.
Gilles 'SO- smetti di essere malvagio' l'

1

Stavo avendo un problema con la storia che è stata limitata 10000fino a quando ho capito che oh-my-zsh stava impostando i propri valori HISTSIZEe SAVEHISTvalori. TL; DR, assicurati di mettere le linee nella parte inferiore del tuo .zshrc.


0

Il problema non era con zsho mio .zshrc, ma con la mia storia. C'erano alcune voci strane come

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

che confuso zshe tutto ciò che è stato troncato dopo queste voci. Non so a quale personaggio ^@corrisponda o come queste voci siano finite nella mia cronologia, ma rimuoverle ha risolto il problema.


quale terminale ed editore usi?
aurelien,

perché la domanda ora è: tornerà più tardi?
aurelien,

terminologye vim.
pfnuesel,

1
^@è il carattere ASCII NUL ( \0).
muru,

6
I caratteri ^ @ ^ @ ^ @ ^ @ sono nulli e vengono spesso visualizzati quando due programmi provano a scrivere nello stesso file contemporaneamente e non utilizzano scritture atomiche (ad es. Sono scritture bufferizzate) o bloccano . Oppure può essere causato da corruzione del file system, ripristino errato dal backup o simili.
user222658
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.