zsh中的无限历史记录


42

在中zsh,我希望拥有无限的历史记录。我设置了HISTSIZE=,在bash。现在我导入了一个古老的历史

mv old_history .history

很大

wc -l .history
43562 .history

如果现在关闭并重新开始zsh,我会看到

wc -l .history
32234 .history

我可以拥有无​​限的历史zsh吗?


zsh似乎与bash wiki.gentoo.org/wiki/Zsh/Guide#History的工作原理不同,本指南应可帮助您了解zsh历史。
aurelien

Answers:


50

您的机器有局限性和可能性。

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 Mailing列表中

您应该确定自己有多少内存,可以允许多少内存被历史记录占用(AFAIK始终将其完全加载到内存中)并采取相应的措施。取消限制不是明智的选择,因为它会使您想到没有限制,而它总是受到可用资源的限制。

或者,如果您不认为自己会遇到资源耗尽的问题,则可以从limit.h中将HISTSIZE设置为LONG_MAX:这是HISTSIZE可以拥有的最大数量。

其中解释了Gentoo解决方案:

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

没有以下命令将无法保存历史记录:

export SAVEHIST=$HISTSIZE

为了防止历史记录记录重复的条目(例如在单个shell会话中多次输入的ls -l),可以设置hist_ignore_all_dups选项:

setopt hist_ignore_all_dups

一种有用的技巧,可以通过在特定条目之前至少留一个空格来防止它们记录到历史记录中。

setopt hist_ignore_space

我看不出如何回答我的问题。我的历史记录文件的大小为683 kB,对我的内存来说肯定不是太大吗?
pfnuesel

3
用户$ export HISTSIZE = 9999999999999999999999999999999999999999999999999999999999999999999939999 您必须设置该数字,以使其最适合您的意愿和计算机的可能性。
aurelien

我可以将其设置为50000,但这不能解决我的问题。
pfnuesel

1
您的问题是我在zsh中不能拥有无限的历史记录吗?ZSH作者回答“ 否”,但您可以根据需要设置它。Gentoo正确地解释了如何做。
aurelien '16

1
这些解决方案均无法在zsh中使用。大约一两个星期后,它仍然可以将其切断。我多年来一直在处理这个问题,这太荒谬了。我终于用logrotate做到了。
kristopolous

17

您需要同时设置HISTSIZESAVEHIST。它们分别指示要在内存中保留多少行历史记录和在历史记录文件中保留多少行。

我不认为zsh的设置意味着“无穷大”,但出于所有实际目的,十亿是无穷大的,而在32位计算机上仍然可以用机器表示。

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

我是否应该担心在内存中保留如此多的行会降低计算机的速度?
becko

7
您不会在生命周期中键入足够的历史记录来减慢2010年代PC的速度。
吉尔斯(Gilles)'所以

1

我有在经过了封的历史问题10000,直到我意识到,哦,我的-的zsh被设置自己的HISTSIZESAVEHIST值。TL; DR,请确保将这些行放在的底部.zshrc


0

问题不在于zsh.zshrc,而是我的历史。有一些奇怪的条目,例如

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

混乱zsh,这些条目之后的所有内容都被截断了。我不知道是什么字符^@,或者这些条目在我的历史记录中是如何结束的,但是删除它们可以解决问题。


您使用哪个终端和编辑器?
aurelien

因为现在的问题是,那以后还会再来吗?
aurelien

terminologyvim
pfnuesel

1
^@是ASCII NUL(\0)字符。
muru

6
^ @ ^ @ ^ @ ^ @字符为空,当两个程序尝试同时写入同一文件,并且不使用原子写入(例如,它们是缓冲写入)或锁定时,它们经常显示。也可能是由于文件系统损坏,备份还原不当或类似原因引起的。
user222658
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.