![在多个 zsh shell 中共享历史记录](https://linux22.com/image/1342912/%E5%9C%A8%E5%A4%9A%E4%B8%AA%20zsh%20shell%20%E4%B8%AD%E5%85%B1%E4%BA%AB%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95.png)
我正在尝试设置zsh
以便它在不同的zsh
会话之间共享命令历史记录:
- 在多个标签页中
- 在多个 gnome 终端中
- 在不同的
screen
会话中
我已经把它放进去了.zshrc
#To save every command before it is executed (this is different from bash's history -a solution):
setopt inc_append_history
#To retrieve the history file everytime history is called upon.
setopt share_history
但那不起作用。
例如,我输入 1 个命令:gedit afile
然后我转到 zsh 并输入history
。我没有看到gedit afile
。
'setopt' 的输出是
% setopt
nohistbeep
histexpiredupsfirst
histfindnodups
histignorealldups
histignoredups
histignorespace
histnostore
histreduceblanks
histsavenodups
histverify
incappendhistory
interactive
monitor
promptsubst
sharehistory
shinstdin
zle
我怎样才能实现这个目标?
答案1
对你的问题的简单回答是你需要设置share_history
,你可以这样做:
setopt share_history
由于您显然已经这样做了(并且该选项确实有效)。我建议您检查:
- 无论两个都shell 有选项设置;
- 您是否没有在命令前输入空格(因为
histignorespace
会使这些命令被忽略) - 您是否
$HISTFILE
在所有 shell 中将其设置为相同的值? - 您是否实际保存了任何历史记录?假设您
echo 123
在 tab-1 中发出。转到 tab-2,调用history
。它在那里吗?(根据您的问题,不是)。现在发出,fc -R
(意味着重新读取历史文件),然后history
它现在在那里吗?如果没有,您可能还想在 tab-1 中调用fc -A
(-A
将强制将您的历史记录附加到文件中)以确保历史记录已写入文件。
答案2
尝试搜索后紧迫enter
。
我测试的是:
- 打开 2 个 zsh shell
- 进入 zsh shell 1 并执行
echo "something"
- 进入 zsh shell 2,按
enter
,然后检查是否看到来自 shell 1 的命令。
就我而言不是enter
直到我按下正在搜索的选项卡时才会看到该命令。
答案3
问题可能是你不应该设置INC_APPEND_HISTORY
如果你使用SHARE_HISTORY
-在zsh 选项文档(搜索“SHARE_HISTORY”)。
...还会导致您输入的命令附加到历史文件中(后者就像指定INC_APPEND_HISTORY,如果此选项有效,则应将其关闭)。
INC_APPEND_HISTORY
用于在 shell 之间共享历史记录,同时允许您更好地控制何时导入新的历史记录命令。来自同一文档的一个很好的提示:
如果您发现想要对命令的导入时间进行更多的控制,您可能希望关闭 SHARE_HISTORY,打开 INC_APPEND_HISTORY 或 INC_APPEND_HISTORY_TIME(参见上文),然后在需要时使用“fc -RI”手动导入命令。