Answers:
您的机器有局限性和可能性。
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.
您应该确定自己有多少内存,可以允许多少内存被历史记录占用(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
50000
,但这不能解决我的问题。
您需要同时设置HISTSIZE
和SAVEHIST
。它们分别指示要在内存中保留多少行历史记录和在历史记录文件中保留多少行。
我不认为zsh的设置意味着“无穷大”,但出于所有实际目的,十亿是无穷大的,而在32位计算机上仍然可以用机器表示。
HISTFILE=~/.zsh_history
HISTSIZE=999999999
SAVEHIST=$HISTSIZE
问题不在于zsh
我.zshrc
,而是我的历史。有一些奇怪的条目,例如
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@#1453692179
混乱zsh
,这些条目之后的所有内容都被截断了。我不知道是什么字符^@
,或者这些条目在我的历史记录中是如何结束的,但是删除它们可以解决问题。
terminology
和vim
。
^@
是ASCII NUL(\0
)字符。