我想跨终端共享历史记录并跟踪历史命令的运行时间。直观的方法似乎是同时使用EXTENDED_HISTORY
和SHARE_HISTORY
,但这会在重新启动 shell 后将所有经过的时间戳设置为 0。这是正确的方法吗?有可能吗?
场景 1:EXTENDED_HISTORY
和SHARE_HISTORY
$ history -Dn | sed 's|\\n|\n |g'
0:00 cat << EOF > ~/.zshrc
HISTFILE=~/.zhistory-test
HISTSIZE=100
SAVEHIST=100
setopt EXTENDED_HISTORY
setopt SHARE_HISTORY # the only change compared to below
EOF
0:00 exec zsh
0:00
sleep 1
0:00 exec zsh
场景2:仅EXTENDED_HISTORY
$ history -Dn | sed 's|\\n|\n |g'
0:00 cat << EOF > ~/.zshrc
HISTFILE=~/.zhistory-test
HISTSIZE=100
SAVEHIST=100
setopt EXTENDED_HISTORY
EOF
0:00 exec zsh
0:01
sleep 1
0:00 exec zsh
场景 3:INC_APPEND_HISTORY
和SHARE_HISTORY
与场景1相同,但替换SHARE_HISTORY
为INC_APPEND_HISTORY
似乎具有相同的效果。
系统信息
$ zsh --version
zsh 5.4.2 (x86_64-unknown-linux-musl)
$ ldd /usr/bin/zsh
/lib/ld-musl-x86_64.so.1 (0x7f0f8b1d8000)
libcap.so.2 => /lib/libcap.so.2 (0x7f0f8acfa000)
libncursesw.so.6 => /lib/libncursesw.so.6 (0x7f0f8aa89000)
libc.so => /lib/ld-musl-x86_64.so.1 (0x7f0f8b1d8000)
$ uname -a
Linux hostname 4.12.13_1 #1 SMP PREEMPT Thu Sep 14 13:15:00 UTC 2017 x86_64 GNU/Linux
$ lsb_release -d
Description: Void Linux
答案1
我已经测试了几种尝试在多个终端会话之间共享扩展历史记录的方法,这是唯一一种似乎可以完美工作的方法:
autoload -Uz add-zsh-hook
setopt extendedhistory incappendhistorytime
load-shared-history() {
# Pop the current history off the history stack, so we don't grow
# the history stack endlessly
fc -P
# Load a new history from $HISTFILE and push it onto the history
# stack.
fc -p $HISTFILE
}
# Import the latest history at the start of each new command line.
add-zsh-hook precmd load-shared-history
现在,在任何终端会话中同步历史记录所需要做的就是按 Enter 键。
答案2
您需要的唯一选择是SHARE_HISTORY
这是一个共享历史工作视频
这是文档链接的+ 引用
此选项既可以从历史文件导入新命令,也可以将您键入的命令追加到历史文件中(后者就像指定 INC_APPEND_HISTORY,如果此选项有效,则应将其关闭)。历史记录行还带有时间戳 ala EXTENDED_HISTORY 输出(这使得在重写文件后更容易找到我们停止读取文件的位置)。
默认情况下,历史移动命令访问导入的行以及本地行,但您可以使用 set-local-history zle 绑定打开和关闭此功能。还可以创建一个 zle 小部件,使某些命令忽略导入的命令,而另一些则包含它们。
如果您发现需要更多地控制何时导入命令,您可能希望关闭 SHARE_HISTORY,打开 INC_APPEND_HISTORY 或 INC_APPEND_HISTORY_TIME(见上文),然后在需要时使用“fc -RI”手动导入命令。