行尾的 ANSI 转义代码奇怪行为

ANSI escape code weird behavior at end of line

重现步骤

考虑以下 shell 命令:

echo -e "\e[41mTest\nTest2\e[0mTest3"

它打印 Test 并在下一行 Test2 中使用红色背景(使用 ANSI 转义码)。 Test2 后面直接跟着 Test3,它是无色的。

行为

第一次执行此命令时,一切正常。但是输出不一致。在大约 10-20 次调用之后,第二行的末尾也变成红色。我首先在我的 C++ 应用程序中偶然发现了这一点。所以我认为这可能与 bash.

无关

发现后我认为这可能是 gnome-terminal 中的一个错误。但是 xterm.

中的行为完全相同

编辑

感谢 Geno Chen 的评论,我发现当终端用完行数并且必须滚动时会发生这种情况。

截图

上述问题的截图如下:

GNOME 终端

xterm

有问题的事情

虽然它使我的 C++ 应用程序中的事情变得有点不清楚,但这并不是一个破坏交易的因素。但是我想知道我的转义序列是否有问题,或者这是 shell 某些部分的错误。如果我可以做些什么来修复它或解决它。

用当前选择的颜色填充行是 bce(背景颜色擦除)的一个细节,它可以在不同的终端中以不同的方式实现——但是 Linux console 和 xterm 碰巧做到了这边走。这是一个常见问题解答:

这是为所有搜索快速答案的人准备的。 从 Thomas Dickey 的回答链接中,我想到了以下解决方法。

echo -e "\e[41mTest\nTest2\e[0mTest3\e[K"

\e[K 部分用当前背景颜色绘制该行的其余部分。因为它需要在使用颜色的每一行的每个换行符之前发送,所以我不得不稍微重写我的代码...

@Scindix 的回答对我来说效果很好,所以为了修复背景颜色环绕,我写了一个小脚本,./fill-background-colour-to-line-end,我可以通过管道将另一个命令传送到:

#!/usr/bin/env ruby
# frozen_string_literal: true

STDIN.each_char do |char|
  print "\e[K" if char == "\n"
  print char
end

它不仅解决了环绕的怪异问题,而且将背景色填充到行尾也是我一直想要的 =)

旁注:我尝试了 Tilix 和 LX Terminal;那里的行为是一样的。