历史记录未保存在 zsh 中

31 command-history zsh

每当我打开终端的新实例时,历史记录都是空的。这是为什么?我需要设置什么吗?但是,在 bash 中不需要这样做。

Gil*_*il' 41

Bash 和 zsh 有不同的默认值。默认情况下,Zsh 不会将历史记录保存到文件中。

当你在没有配置文件的情况下运行 zsh 时,它会显示一个配置界面。在这个配置界面,选择

(1)  Configure settings for history, i.e. command lines remembered
     and saved by the shell.  (Recommended.)
Run Code Online (Sandbox Code Playgroud)

然后查看建议的设置并选择

# (0)  Remember edits and return to main menu (does not save file yet)
Run Code Online (Sandbox Code Playgroud)

对其他子菜单重复 (2) 完成、(3) 键绑定和 (4) 选项,然后选择

(0)  Exit, saving the new settings.  They will take effect immediately.
Run Code Online (Sandbox Code Playgroud)

从主菜单。

推荐的历史相关设置是

HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt appendhistory
Run Code Online (Sandbox Code Playgroud)

我会为历史文件使用不同的名称,以表明它是 zsh 的历史文件。在现代系统上可以增加 1000 行。

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt appendhistory
Run Code Online (Sandbox Code Playgroud)

~/.zshrc顺便说一句,这些行进入。


ber*_*ert 20

虽然现有答案是正确的,但我认为可能值得补充的是,可能有比appendhistory保存历史记录更好的选择,这是SHARE_HISTORY.

从文档SHARE_HISTORY“两者都从历史文件中导入新命令,并且还会导致您键入的命令附加到历史文件中”。这意味着 shell 也知道彼此的历史,而不必关闭当前的或打开新的。

所以,你可以这样设置:

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=1000
setopt SHARE_HISTORY
Run Code Online (Sandbox Code Playgroud)

  • +1 并欢迎来到 U/L,但我个人更喜欢 `INC_APPEND_HISTORY_TIME`,它如上所述从所有终端写入历史,但该历史“不会立即从使用相同历史文件的 shell 的其他实例中获得” . 这对我来说更有意义,因为这样我就可以独立地遍历每个终端的历史记录,但它仍然全部被记录下来。 (6认同)
  • 谢谢!是的,这很公平,我完全明白为什么 `INC_APPEND_HISTORY_TIME` 可能更合乎逻辑。我可能不应该说“更好”,我想这只是个人喜好的问题! (2认同)

Chr*_*der 6

如果它不起作用,并且您已经准备好所有这些,请尝试:

fc -W
Run Code Online (Sandbox Code Playgroud)

这会将当前历史记录写入历史文件。如果你得到:

zsh: locking failed for /home/username/.zsh_history: permission denied
Run Code Online (Sandbox Code Playgroud)

那么是时候检查文件父目录的权限了。

  • `fc` 是用于处理历史记录的 shell 内置命令。请参阅 https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html 并搜索“fc”。 (2认同)