为什么 .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_HISTORY
shell 选项(在多个并发 shell 会话之间共享相同的命令历史记录),因此持续时间不会写入历史文件。这是因为该SHARE_HISTORY
选项会导致历史事件被写入执行的命令而不是在终止命令或 shell 会话的时间(当持续时间可用时)。此行为类似于启用INC_APPEND_HISTORY
,但也会从其他会话将新命令读取到当前 shell 的历史记录中。
但是,还有另一个 shell 选项INC_APPEND_HISTORY_TIME
(请注意结尾的_TIME
),即不相容使用SHARE_HISTORY
和INC_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_HISTORY
或INC_APPEND_HISTORY
打开INC_APPEND_HISTORY_TIME
(见上文),然后在需要时使用fc -RI
.
的输出history -D
和内容之间的差异$HISTFILE
是由于前者显示内存中的历史事件,而后者包含写入历史文件的历史事件。写入历史文件的内容(以及何时)取决于各种 shell 选项,到目前为止(在上述说明之后),希望这些选项是显而易见的。