我正在使用控制序列进行文本格式化,并偶然发现了一些意外的行为。我有一些文本要输出,在该文本的中间有一些较小的文本块,并用彩色背景突出显示。原始文本可能很长,可能需要几行,因此中间的彩色文本块可能会出现在多行上 - 从一行开始并在另一行结束。一切似乎都工作正常,直到它到达终端窗口的底部,很多空白变成彩色:
这是一个可以重现的脚本:
# color.sh
echo -e 'default \x1B[43m color \n color \x1B[49m default';
正如您所看到的,我在文本块中添加了一个换行符\n
,只是为了重现,但这是我的情况,当文本很长并且不适合单行时,彩色块会分成多行,结果我在文本后面有相同颜色的空白。
# color-long.sh
echo -e 'default default default default default default default default default \x1B[43m color color \x1B[49m default';
我在 Ubuntu 14.04 上得到了这个,但能够在 Yosemite 10.10 上重现相同的行为。
我想知道这种行为的原因是什么,以及如何在不使用不同的输出实用程序(而不是)的情况下修复它echo
,但也许可以使用相同的控制序列。我可以控制文本,但不能控制输出过程。
我已经尝试过包装像\[\x1B[43m\]
,之类的序列\001\x1B[43m\002
,但它没有给出任何结果,只是[]
在文本中添加了额外的内容或输出一些无法识别的符号。
答案1
同意 @hildred 的观点,认为这是终端特定的行为,但有一些分歧点:
- 如果应用程序碰巧切换到备用屏幕(如在 xterm 中运行的全屏程序,具有合适的终端描述),则不会将任何文本移入回滚缓冲区。
- 行为没有“正确”或“错误”之分,只有惯例。
- 终端设计中有几个(可能)独立的相关功能。
- 由于惯例(以及一些示例,例如 Linux 控制台、xterm 和稍有不同的 rxvt),许多彩色终端的行为类似。
- ncurses 常见问题解答我的终端显示一些未着色的空间更详细的内容。
惯例是一个有力的论据;程序依赖于这些不改变的设计选择。对于导致问题的一些示例,请考虑以下几种情况:
- linux 2.6.26 vt back_color_erase:对 Linux 控制台驱动程序的更改破坏了 bce 模型,如中所述诺维尔#418613。
- 对 xterm 的一些更新导致其光标颜色渗透到新滚动的行中(在 xterm 中提到)补丁 #242关于 Debian#252873,以及 Debian#522141)
最近的 VTE 错误报告,#754596提供有趣的阅读。看来 VTE 的开发人员建议只是改变行为看看会发生什么:
对于初学者来说,我们可以在下一个开发周期“修复”我们的代码(从 _vte_terminal_cursor_down() 中删除“匹配 xterm 并在滚动时填充新行”6 行),看看是否有人抱怨有问题。然后我们会对情况有更好的了解。
答案2
这与 bash 无关,它纯粹是终端行为(特别是滚动)的影响。当您到达屏幕底部并开始在下一行输入时,终端会通过将所有内容向上推一行来创建一个新的空行。 (在较旧的终端中,这会破坏顶行。在较新的终端中,顶行只是被推入回滚缓冲区中。)现在这是一个难题,新行是什么颜色。前景色不是问题,因为你看不到它,但背景色是问题。 。 。 (在他们开始争论它可以是黑灰色或白色(或者实际上是黑绿色、亮绿色或琥珀色中的相同颜色)的日子里,有一些实验只使用黑色,但也有人抱怨。确定的是新行(或在屏幕清除的情况下清除整个屏幕中的清除区域)将使用当前背景颜色作为受影响区域的背景颜色。所以这种行为是设计使然,因为它在大多数情况下都会做正确的事情。
那么你想做什么来获得你想要的行为呢?当您更改回黑色背景(或在行尾)时,发送一个清除到行尾,这将为行的其余部分设置背景颜色。