是否有可能在所有 shell 之间共享单个命令历史记录?
我认为默认情况下历史记录会被首先退出的 shell 覆盖。之前我做过每个 shell 都有一个“名称”和自己的历史文件的东西,但现在我对 shell 的使用更加轻量级,所以感觉有点矫枉过正。
更新
看来我没有启用 incapendhistory:
> setopt | grep inc
跑步setopt incappendhistory
解决了这个问题。然后,通过查看历史文件,我可以看到这些文件是立即附加的。
然而,这个历史记录似乎只有在打开新外壳后才可用于其他外壳(这可能是我所追求的行为)。在其他 shell 中使用命令进行的设置立即sharedhistory
可用。setopt
我实际上并不认为这就是我所追求的 - 因为在不同的 shell 中拥有不同的历史是有用的。我只是不想失去历史。
答案1
首先,默认情况下,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
或share_history
来不时显式导出当前会话的历史记录,这会非常有用。
我在这个答案中描述的默认值是 zsh 默认值。一些发行版和大多数 zsh 配置框架至少会默认启用历史记录,并且可能会更改一些与历史记录相关的选项。