400 the Cat Asked: 2022-09-13 22:26:40 +0800 CST2022-09-13 22:26:40 +0800 CST 2022-09-13 22:26:40 +0800 CST ANSI 终端颜色表现异常 772 尝试在终端输出中打开和关闭背景颜色时遇到奇怪的行为: #!/bin/sh printf "\e[48;5;203m" printf "AAA\n" printf "\e[0m" printf "BBB\n" printf "CCC\n" 我想AAA用红色背景打印,然后关闭背景颜色,然后打印下一行。但是,这是输出的样子: 更新 好的,我从一个新的终端尝试过,它可以按预期工作。但是我仍然打开了旧的终端窗口,在那里我得到了如图所示的输出。那里发生了什么?终端中是否有一些“垃圾”,这是造成这种情况的原因? 我reset在旧的终端窗口中做了,现在输出是正确的。 bash shell 2 个回答 Voted Best Answer Kamil Maciorowski 2022-09-13T23:51:10+08:002022-09-13T23:51:10+08:00 当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. egmont 2022-09-15T11:53:15+08:002022-09-15T11:53:15+08:00 正如@Kamil Maciorowski 回答的那样,您应该在打印换行符之前恢复背景颜色。 但是,这可能仍然会给您带来意想不到的背景颜色,具体取决于: 是否有隐式换行(您打印的文本比终端宽), 无论您是否使终端滚动, 终端仿真器的具体选择,进一步归结为: 是否实现“背景颜色擦除”(bce), 它是否(有意或无意)偏离标准(xterm)bce 实现。 您可能对https://bugzilla.gnome.org/show_bug.cgi?id=754596感兴趣,了解详细信息,解释 xterm 的 bce 处理不可避免的问题,以及 VTE(GNOME 终端等)如何故意改变行为以解决该问题问题的方式不会导致现有应用程序中的已知回归。
当
AAA\n
打印在终端的最底部时,终端需要滚动文本并在底部出现一个空行。它使用当前背景颜色(红色)显示线条。然后BBB\n
在这个背景上打印,使用它自己的背景颜色。新的背景颜色仅影响当前行 (BBB
) 中的几个字符,但在下一个空行出现时是相关的。实际上,下一行(CCC
将出现的位置)看起来很正常。当
AAA\n
不在底部打印时,终端不需要添加一行,空白已经存在。碰巧空白处是黑色的。要重现,请多次运行您的代码,直到您到达终端底部并“超越”。
以下两个命令在重复时(每个都在自己的终端中),给出看起来相同的输出,直到到达底部:
在第二种情况下,背景会在
\n
.我的测试平台:Konsole 21.12.3,
TERM=xterm-256color
.正如@Kamil Maciorowski 回答的那样,您应该在打印换行符之前恢复背景颜色。
但是,这可能仍然会给您带来意想不到的背景颜色,具体取决于:
您可能对https://bugzilla.gnome.org/show_bug.cgi?id=754596感兴趣,了解详细信息,解释 xterm 的 bce 处理不可避免的问题,以及 VTE(GNOME 终端等)如何故意改变行为以解决该问题问题的方式不会导致现有应用程序中的已知回归。