我教授各种 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。