历史记录如何打印到终端?

历史记录如何打印到终端?

编辑:根据@JdeBP的评论,我了解到交互式终端的历史命令和历史调用功能是两个独立的东西。然而,我仍然好奇 GNU readline 历史记录调用功能如何打印到屏幕上。

我开始意识到 bashhistory命令并不用于stdout将以前的命令打印到终端窗口。我在探索一个单独的问题时遇到了这个问题(关联),现在我很好奇它到底是如何工作的。

当您键入命令并按 Enter 键时,可以使用向上箭头向上拉出上一个命令。但是,上一个命令不是通过 发送的stdout。这可以通过将所有内容重定向stdout到协进程来看到,协进程在将输出打印到屏幕之前修改输出。下面的脚本正是这样做的。它只是回显您键入的内容,但也会预先重定向stdout到命令。sed

exec 4>&1
coproc out (sed 's/^/PREFIX /' >&4)
exec 1>&${out[1]}

while read -e x; do
   echo $x
done

执行此脚本时,您键入的任何内容都将打印带有“PREFIX”前缀的内容。但是,当您使用向上箭头访问先前的命令时,不会预先添加“PREFIX”。

为什么是这样? GNU 历史记录调用如何将历史文件中的文本放置到终端屏幕上?如果它不使用stdout,它是否利用stderr,或者其他什么?我尝试stderr以相同的方式重定向,但这会导致我的文本不会回显到终端屏幕,从而使向上/向下箭头不打印任何内容。因此我无法验证。我想这可能表明这个历史功能使用stderr,但我想确认一下。

相关内容