更新

更新

当我尝试在终端输出中打开和关闭背景颜色时遇到奇怪的行为:

#!/bin/sh

printf "\e[48;5;203m"
printf "AAA\n"
printf "\e[0m"

printf "BBB\n"
printf "CCC\n"

我想AAA用红色背景打印,然后关闭背景颜色,并打印下一行。然而,输出是这样的:

在此输入图像描述

更新

好的,我从一个新的终端尝试了,它按预期工作。但我仍然打开旧的终端窗口,在其中我得到如图所示的输出。那里发生了什么?终端中是否留下了一些“垃圾”,导致了这种情况?

reset在旧的终端窗口中执行了操作,现在输出是正确的。

答案1

何时AAA\n打印在终端的最底部,终端需要滚动文本并使底部出现一个空行。它使用当前背景颜色(红色)显示该行。然后BBB\n使用其自己的背景颜色打印在该背景上。新的背景颜色仅影响当前行 ( BBB) 中的几个字符,但在下一个空行出现时相关。实际上,下一行(CCC将出现的位置)看起来很正常。

AAA\n不在底部打印时,终端不需要添加一行,空白已经存在。碰巧空白处是黑色的。

要重现,请多次运行代码,直到到达终端底部并“超越”。

重复以下两个命令(每个命令都在其自己的终端中)时,会给出看起来相同的输出,直到到达底部:

  1. printf "\e[48;5;203mAAA\n\e[0m"
    
  2. 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 终端等)如何有意改变行为以不会导致现有应用程序中已知的回归的方式修复该问题。

相关内容