zsh 中的无限历史记录

zsh 中的无限历史记录

zsh,我想要拥有无限的历史。我设置了HISTSIZE=,它适用于bash.现在我导入旧历史

mv old_history .history

这是相当大的

wc -l .history
43562 .history

如果我现在关闭并zsh重新开始,我会明白

wc -l .history
32234 .history

我不能拥有无限的历史记录zsh吗?

答案1

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

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 邮件列表:

您应该确定您有多少内存,可以允许历史记录占用多少内存(据我所知,它总是完全加载到内存中)并采取相应的行动。消除限制并不明智,因为它会让您认为没有限制,但总是受到可用资源的限制。

或者,如果您认为不会遇到资源耗尽的问题,您可以从 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

答案2

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

我不认为 zsh 有一个表示“无限”的设置,但出于所有实际目的,十亿是无限的,同时在 32 位机器上保持机器可表示。添加~/.zshrc

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

答案3

我一直对历史记录有限制,10000直到我意识到 oh-my-zsh 正在设置自己的HISTSIZESAVEHIST。 TL;DR,请确保将这些行放在.zshrc.

我遇到的另一个问题是我的历史记录被截断为 1024 行。虽然我不确定为什么,但我通过以下方法解决了这个问题:

  • 设置HISTFILE=$HOME/.zsh_hist(与以前不同的东西)
  • 明确设置HISTFILE=$HOME/.bash_history~/.bashrc
  • 进行正常设置,例如HISTSIZE=100000SAVEHIST=100000

我认为这可能与我使用exportset相关,这导致 bash在从 ZSH 交互启动时HISTFILE使用相同的变量,这会截断它。HISTFILE只要您确保不这样做,设置 bash 历史文件可能就没有必要export HISTFILE

答案4

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

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

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

相关内容