编辑:根据@JdeBP的评论,我了解到交互式终端的历史命令和历史调用功能是两个独立的东西。然而,我仍然好奇 GNU readline 历史记录调用功能如何打印到屏幕上。
我开始意识到 bash我在探索一个单独的问题时遇到了这个问题(关联),现在我很好奇它到底是如何工作的。history
命令并不用于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
,但我想确认一下。