Zsh:机器之间的一致历史

Tuy*_*ham 6 command-history zsh version-control

用例:在源代码管理中的机器之间分发 zsh 的历史记录。

这是我可以用 zsh 的历史实现的东西 - 将历史放在版本控制中机器之间的同步吗?这是为了避免重新键入命令和快速跟踪。

jmu*_*sch -1

这是尝试回答如何使用bashzsh

inzsh函数与inprecmd类似,它在每个新提示之前执行。PROMPT_COMMANDbash

使用 bash 的示例:

$ function precmd() {
    echo ssh copy the files to another machine
}
$ export OLD_PROMPT=$PROMPT_COMMAND
$ unset PROMPT_COMMAND && export PROMPT_COMMAND="precmd; $PROMPT_COMMAND"
ssh copy the files to another machine
$ pwd
/home/jmunsch
ssh copy the files to another machine
$ export PROMPT_COMMAND=$OLD_PROMPT
Run Code Online (Sandbox Code Playgroud)

使用 zsh 的示例:

% function precmd() {
    echo ssh copy the files to another machine
}
% pwd
/home/jmunsch
ssh copy the files to another machine
% unset -f precmd
Run Code Online (Sandbox Code Playgroud)

将其添加到.zshrc

function precmd() {
    # across terminals, sessions 
    setopt APPEND_HISTORY
    export machines="192.168.43.70 192.168.43.71 192.168.43.72"
    for m in $machines; do
        scp ~/.zsh_history $m:~/.zsh_history
    done
}
Run Code Online (Sandbox Code Playgroud)

为了.bashrc

function precmd() {
    # since bash generally saves history on session exit
    history -a # append session to history
    history -c # clear session
    history -r # read from history
    export machines="192.168.43.70 192.168.43.71 192.168.43.72"
    for m in $machines; do
        scp ~/.zsh_history $m:~/.zsh_history
    done
}
export PROMPT_COMMAND="precmd; $PROMPT_COMMAND"
Run Code Online (Sandbox Code Playgroud)

为了更容易做到这一点

  • 设置基于密钥的 ssh 登录或无密码登录。
  • 将主机名/用户名添加到.ssh/ssh_config.

有关的:

关于这里的使用情况的一些假设是,一次只有 1 个人使用 1 个会话,所有计算机都在线,并且所有历史记录都成功更新。

您也许可以添加一些额外的步骤来合并历史记录,或保持历史记录的顺序。

使用git:

  • 输入命令
  • 提交更改
  • 将更改推送到存储库
  • 在所有其他机器上拉动更改

据我了解,这不是一个小问题。举例来说,您登录到具有相同历史记录的两台机器,但随后同时输入两个不同的命令;这两个命令都被保存了吗,历史记录是否有所不同,它们是否会相互覆盖?

要进一步研究分布式一致性/共识:

  • 你到底为什么定义一个变量只是为了“eval”它?直接把代码放在`precmd`中!另外,你还没有真正解决问题。您将文件历史记录上传到另一台计算机,但从未下载它。因此 `$machine1` 将只包含您使用它的最后一台机器的历史记录。 (2认同)