【问题标题】:combine history across tty跨 tty 合并历史
【发布时间】:2017-03-17 02:40:02
【问题描述】:

在任何给定时间,我都有 3 次登录到同一台服务器。当然,我经常使用屏幕,但假设这个目的允许我有:

 1 session running something
 1 session looking at output
 1 session shuffling files to/from various places

如果在任何时候我失去了所有三个连接,我会失去 2/3 的历史记录,因为当我重新登录时,我会从我的三个连接中的随机 1 个中获取历史记录。

有没有办法阻止这种情况并将所有三个历史文件合并为 1 个?

或者,有没有办法将每个登录声明为“ttyN”,从而使每个登录都具有单独的历史记录,但可检索/可重新连接?

谢谢!

【问题讨论】:

  • 您需要历史记录做什么?从头开始解决您的问题似乎并非易事......
  • 您可以定义 bash 必须使用的历史文件的名称。该文件是在 bash 进程退出时写入的。 (但我从未使用过它。)使用它,只要您使用不同的“HISTFILE”设置启动 bash,您就可以拥有 3 个不同的历史文件

标签: linux bash


【解决方案1】:

可能的解决方案?

打开终端/屏幕后

使用 History-File 设置启动您的 shell:

HISTFILE=$HOME/session1-history  bash

并继续使用此 bash。 运行不同的会话历史记录

HISTFILE=$HOME/session2-history  bash

等等

【讨论】:

    【解决方案2】:

    只需将其添加到您的 .bashrc 文件中即可。

    # Avoid duplicates..
    export HISTCONTROL=ignoredups:erasedups  
    
    # Append history entries..
    shopt -s histappend    
    
    # After each command, save and reload history
    export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
    

    Unix Stackexchange post 找到了这个答案。

    我试过这个,它似乎可以同时在多个终端上工作,唯一的问题是你必须为终端执行一个命令来从 .bash_history 获取最新的历史记录。

    例如,如果我打开第一个终端并输入echo check 1,然后打开第二个终端并输入echo check 2。现在,如果我回到第一个终端并按向上键,我不会得到echo check 2,因为最后一次从历史文件中获取历史是在我执行上一个命令时。所以我可以在不指定命令的情况下按Enter,它将获取最后的历史条目。现在如果我按向上键,它将显示echo check 2,这是预期的行为。

    【讨论】:

      【解决方案3】:

      有一个用于 bash 和 zsh 的开源 shell 历史记录器可以解决您的问题(免责声明:我编写并维护它)。

      https://github.com/barabo/advanced-shell-history

      这个想法是使用内置的 bash 挂钩将您的命令写入 sqlite3 数据库。如果您真的需要返回并弄清楚您输入了哪些命令/它们运行了多长时间/它们的退出代码是什么 - 您应该尝试一下。

      它救了我很多次。

      【讨论】:

        【解决方案4】:

        您可以设置许多选项来防止 Bash 实例覆盖彼此的历史记录。完整解释请见this FAQ

        在你的.bashrc,添加

        HISTFILESIZE=400000000
        HISTSIZE=10000
        PROMPT_COMMAND="history -a"
        export HISTSIZE PROMPT_COMMAND
        shopt -s histappend
        

        【讨论】:

        • 似乎不起作用。我将其插入 .bashrc,重新启动(无论如何都需要这样做),然后在重新登录时,来自会话 2 的 tty 命令不在会话 1 的历史记录中。反之亦然。
        • 这只防止不同的shell覆盖历史文件。它不会实时地在另一个运行的 shell 中生成历史。如果您以任意顺序关闭两个 shell 并启动第三个 shell,您会看到两者的历史都在第三个中可用,而不是在您开始之前只有一个。
        【解决方案5】:

        如果我正确理解了您的要求,则您打开了多个终端会话,并希望在一个会话中输入的命令可以通过其他会话的历史记录使用。

        您需要将这些行放在您的 ~/.bashrc 之上:

        export HISTFILESIZE=100000
        export HISTSIZE=100000
        # avoid & erase dups
        export HISTCONTROL=ignoredups:erasedups
        shopt -s histappend
        # save & reload history after each command enter in shell
        export PROMPT_COMMAND="\history -a; \history -c; \history -r; $PROMPT_COMMAND"
        

        最重要的是histappend,它确保每次都将新的历史记录行附加到历史记录文件中。

        PS:您需要按 Enter 键才能查看每个会话中最近添加的历史记录。

        有关更强大的解决方案,请参阅:http://ptspts.blogspot.in/2011/03/how-to-automatically-synchronize-shell.html

        【讨论】:

          猜你喜欢
          • 2014-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多