为什么 .zsh_history 中的持续时间列通常为 0,尽管“history -D”命令显示它?

为什么 .zsh_history 中的持续时间列通常为 0,尽管“history -D”命令显示它?

为什么 .zsh_history 中的持续时间列通常为 0,尽管“history -D”命令显示它?

测试后这个答案.zsh_history 中数字时间戳后带有“0”的列的用途是什么?我注意到,虽然该history -D命令显示了该命令的运行时间,但持续时间列~/.zsh_history仍然显示0

这是什么原因呢?

是因为~/.zsh_history文件在初始命令时更新,但之后没有更新,还是history -D从单独的位置(可能是从内存或另一个文件)获取时间?

答案1

当我查看自己的设置时,在回答您之前的问题后,我也遇到了同样的问题。在回答您之前的问题时,我使用的是zsh具有默认设置的 shell 会话,并且在启用EXTENDED_HISTORY.我可以看到 shell 会话终止后正确写入的持续时间($HISTFILE默认情况下,内存中的历史记录将写入文件)。然而,在我自己的$HISTFILE文件中,我注意到持续时间全部为零,即使我使用了EXTENDED_HISTORY.

查询zsh-users邮件列表后发现,由于我还使用了SHARE_HISTORYshell 选项(在多个并发 shell 会话之间共享相同的命令历史记录),因此持续时间不会写入历史文件。这是因为该SHARE_HISTORY选项会导致历史事件被写入执行的命令而不是在终止命令或 shell 会话的时间(当持续时间可用时)。此行为类似于启用INC_APPEND_HISTORY,但也会从其他会话将新命令读取到当前 shell 的历史记录中。

但是,还有另一个 shell 选项INC_APPEND_HISTORY_TIME(请注意结尾的_TIME),即不相容使用SHARE_HISTORYINC_APPEND_HISTORY,它会在命令终止后以我们期望的方式将历史事件附加到文件中。

手册zshoptions(1)是这样说的:

INC_APPEND_HISTORY_TIME
此选项是一种变体,INC_APPEND_HISTORY其中在可能的情况下,在命令完成后将历史条目写入文件,以便将命令所花费的时间以EXTENDED_HISTORY 格式正确记录在历史文件中。这意味着历史记录条目不会立即从使用相同历史文件的 shell 的其他实例中可用。

INC_APPEND_HISTORY此选项仅在和 SHARE_HISTORY关闭时才有用。这三个选项应被视为相互排斥。

如果您想使用INC_APPEND_HISTORY_TIME并且仍然能够在多个并发 shell 会话之间共享历史记录,该SHARE_HISTORY选项的文档建议fc -RI在需要时在 shell 中使用从其他 shell 读取事件:

如果您发现需要更多地控制何时导入命令,您可能希望关闭SHARE_HISTORYINC_APPEND_HISTORY打开INC_APPEND_HISTORY_TIME(见上文),然后在需要时使用 fc -RI.

的输出history -D和内容之间的差异$HISTFILE是由于前者显示内存中的历史事件,而后者包含写入历史文件的历史事件。写入历史文件的内容(以及何时)取决于各种 shell 选项,到目前为止(在上述说明之后),希望这些选项是显而易见的。

相关内容