Mic*_*nov 6 command-line colors terminal escape-characters
我正在处理文本格式的控制序列,并偶然发现了一些意外行为。我有一些文本要输出,在这个文本的中间有一些较小的文本块,带有彩色背景。原始文本可能很长,可能需要几行,因此中间的彩色文本块可能会出现在多行中——从一行开始,在另一行结束。一切似乎都正常,直到到达终端窗口的底部,很多空白变成了彩色:

这是一个重现的脚本:
# color.sh
echo -e 'default \x1B[43m color \n color \x1B[49m default';
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我\n在文本块中添加了一个换行符,只是为了重现,但在我的情况下,当文本很长并且它不适合一行时,彩色块被分成多行,结果我在文本后有相同颜色的空白。
# color-long.sh
echo -e 'default default default default default default default default default \x1B[43m color color \x1B[49m default';
Run Code Online (Sandbox Code Playgroud)

我在 Ubuntu 14.04 上得到了这个,但能够在 Yosemite 10.10 上重现相同的行为。
我想知道这种行为的原因是什么,以及如何在不使用不同的输出实用程序(而不是echo)的情况下修复它,但也许可以使用相同的控制序列。我可以控制文本,但不能控制输出过程。
我已经尝试包装像\[\x1B[43m\], 之类的序列\001\x1B[43m\002,但它没有给出任何结果,只是[]向文本添加了额外的内容或输出了一些无法识别的符号。
同意@hildred 这是特定于终端的行为,但存在一些不同意见:
公约是一个强有力的论据;程序依赖于这些不会改变的设计选择。对于导致问题的几个示例,请考虑以下几种情况:
VTE 最近的错误报告,#754596提供了有趣的阅读。似乎 VTE 的开发人员建议更改行为以查看会发生什么:
首先,我们可以在下一个开发周期中“修复”我们的代码(从 _vte_terminal_cursor_down() 中删除“匹配 xterm 并在滚动时填充新行”6 行),看看是否有人抱怨有什么问题。然后我们就会更好地了解情况。
这与 bash 无关,它纯粹是终端行为(特别是滚动)的影响。当您到达屏幕底部并开始在下一行输入时,终端会通过将所有内容向上推一行来创建一个新的空行。(在较旧的终端中,这会破坏顶行。在较新的终端中,顶行只是被推入回滚缓冲区中。)现在这是一个难题,新行是什么颜色。前景色不是问题,因为你看不到它,但背景色是问题。。。(在他们开始争论它可以是黑灰色或白色(或者实际上是黑绿色,亮绿色或琥珀色中的相同颜色)的日子里,有一些实验只使用黑色,但也有人抱怨。确定的是新行(或在屏幕清除的情况下清除整个屏幕中的清除区域)将使用当前背景颜色作为受影响区域的背景颜色。所以这种行为是设计使然,因为它在大多数情况下都会做正确的事情。
那么你想做什么来获得你想要的行为呢?当您更改回黑色背景(或在行尾)时,发送一个清除到行尾,这将为行的其余部分设置背景颜色。