答案1
何时AAA\n
打印在终端的最底部,终端需要滚动文本并使底部出现一个空行。它使用当前背景颜色(红色)显示该行。然后BBB\n
使用其自己的背景颜色打印在该背景上。新的背景颜色仅影响当前行 ( BBB
) 中的几个字符,但在下一个空行出现时相关。实际上,下一行(CCC
将出现的位置)看起来很正常。
当AAA\n
不在底部打印时,终端不需要添加一行,空白已经存在。碰巧空白处是黑色的。
要重现,请多次运行代码,直到到达终端底部并“超越”。
重复以下两个命令(每个命令都在其自己的终端中)时,会给出看起来相同的输出,直到到达底部:
-
printf "\e[48;5;203mAAA\n\e[0m"
-
printf "\e[48;5;203mAAA\e[0m\n"
在第二种情况下,背景被重置前 \n
。
我的测试平台:Konsole 21.12.3 TERM=xterm-256color
,.
答案2
正如@Kamil Maciorowski 回答的那样,你应该恢复背景颜色前打印换行符。
但是,这可能仍然会给您带来意想不到的背景颜色,具体取决于:
- 是否存在隐式换行(您打印的文本比终端宽),
- 无论您是否导致终端滚动,
- 终端仿真器的具体选择,进一步归结为:
- 是否实现“背景颜色擦除”(bce),
- 是否(有意或无意)偏离了标准 (xterm) bce 实现。
您可能感兴趣https://bugzilla.gnome.org/show_bug.cgi?id=754596有趣的细节解释了 xterm 的 bce 处理中不可避免的问题,以及 VTE(GNOME 终端等)如何有意改变行为以不会导致现有应用程序中已知的回归的方式修复该问题。