是否有可能在所有 shell 之间共享一个命令历史记录?
我认为默认情况下,历史记录会被首先退出的 shell 覆盖。在我完成每个 shell 都有一个“名称”和它自己的历史文件的事情之前,但是我现在对 shell 的使用更加轻量级了,所以感觉有点矫枉过正。
更新
看起来我没有启用 incappendhistory :
> setopt | grep inc
运行setopt incappendhistory
解决了这个问题。然后我可以通过查看这些文件立即附加的历史文件看到。
然而,这个历史似乎只有在打开一个新的 shell 后才对其他 shell 可用(这可能是我所追求的行为)。sharedhistory
使用其他 shell 中的命令进行设置setopt
立即可用。我实际上并不认为这就是我所追求的——因为在不同的 shell 中拥有不同的历史是有用的。我只是不想失去历史。
首先,默认情况下,zsh 不保存命令历史记录。您需要设置
HISTFILE
要保存历史记录的文件的路径以及要保存的SAVEHIST
行数。请参阅Zsh 中的命令历史记录。在这个答案的其余部分,我将假设历史正在被保存,并讨论它何时被保存和加载。默认情况下,zsh 在启动时加载历史记录,并在退出时保存。当它保存历史时,它会将当前会话的历史附加到历史文件中。因此,即使有并发会话,也不会丢失历史记录(直到历史记录文件达到 1.2 倍
$SAVEHIST
行,此时 zsh 将修剪文件)。这种方法的主要优点是会话中的行保持组合在一起。一个缺点是会话 A 中的行只会出现在会话 A 退出后启动的会话中。另一个缺点是,如果您的机器(或 zsh)崩溃,历史记录会丢失(但如果终端只是消失,例如由于网络问题导致 SSH 连接中断,历史记录会保存)。如果您打开该
share_history
选项,zsh 将在输入每个历史记录行后立即保存它,并在它们可用时立即加载新的历史记录行。(或者更准确地说,在显示新提示之前;zsh 在您编辑命令行时不会读取历史记录。)主要优点是历史记录行在所有会话中都可以立即使用。主要的缺点是来自不同会话的行最终会混合在一起,因此历史上连续的行相互之间可能没有任何意义。还有选项
inc_append_history
和inc_append_history_time
。它们会导致 zsh 在运行每个命令后立即保存历史记录,但它不会自动读取新的历史记录行(当然,除了它启动时)。该_time
变体在运行命令后而不是之前保存历史记录,这允许 zsh 节省运行时间。您可以关闭该
append_history
选项,zsh 将在保存历史文件时覆盖它,而不是附加到它。因此,如果您启动会话 A,然后启动会话 B,然后退出 A,然后退出 B,则来自 A 的历史记录将丢失。我想不出选择这种行为的充分理由(但这是 bash 的默认设置)。您可以随时通过运行将新行导入历史文件
fc -RI
。如果您不使用share_history
, 不时从其他会话中显式导入历史记录,这很有用。您可以随时通过运行将新行保存到历史记录中
fc -AI
。如果您不使用inc_append_history
orshare_history
不时显式导出当前会话的历史记录,这将很有用。我在这个答案中描述为默认值的是 zsh 默认值。一些发行版和大多数 zsh 配置框架至少会默认启用历史记录,并且可能会更改一些与历史记录相关的选项。