镜子狂欢历史

镜子狂欢历史

我教授各种 CLI 工具,如 git、docker 等。我想要两个 bash 终端:一个用于运行命令并获取输出,另一个用于始终镜像命令历史记录将给我的内容。

是否可以像这样在 bash 中镜像实时命令?

例子:

T1:密码

T1:/家/我

T1:ls

T1:文档桌面下载

T2:

pwd
ls

答案1

因此,让我们将问题分为两部分:

首先,您需要确保 bash 历史记录立即更新。每次键入任何输入并按 Enter 键时,命令都应写入.bash_history.

这可以通过在您的 中添加类似以下内容来实现.bashrc

PROMPT_COMMAND='history -a; history -c; history -r'

其次,您要.bash_history不断地读取该文件。为此,您可以tail在第二个终端中使用以下命令:

tail -f .bash_history

-f参数意味着,tail 使文件保持打开状态并在写入时打印新行。

答案2

如果需要打印命令它被执行,使用 bash DEBUG 陷阱相当复杂,但是看看这个答案长版。这是一个简单的版本。创建一个文件,~/traceme内容如下:

#!/bin/bash
# run preexec on each cmd before execute it
# see https://superuser.com/a/175802/458747
preexec(){ 
    echo "$1" >>~/myhistory
}
preexec_invoke_exec(){
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    # don't cause a preexec for $PROMPT_COMMAND
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return 
    local this_command=$(HISTTIMEFORMAT= history 1 | 
                                         sed -e "s/^[ ]*[0-9]*[ ]*//");
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

然后在您的 T1 航站楼执行source ~/traceme.然后在T2做tail -f ~/myhistory。您在 T1 中输入的每个命令在执行之前都将写入 T2 中尾部的文件末尾。

答案3

当您询问 bash 时,不知道这对您来说是否是一个可行的选择。但 zsh 将历史直接写入.zsh_history.这样您就可以拥有一台终端tail -f .zsh_history。并使用另一个 zsh 终端来执行实际命令。

但前提是你愿意使用 zsh。

相关内容