ANSI 终端颜色表现奇怪

Mar*_*ter 6 shell colors bash terminal

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

#!/bin/sh

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

printf "BBB\n"
printf "CCC\n"
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

更新

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

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

Kam*_*ski 19

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

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

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

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

  1. printf "\e[48;5;203mAAA\n\e[0m"
    
    Run Code Online (Sandbox Code Playgroud)
  2. printf "\e[48;5;203mAAA\e[0m\n"
    
    Run Code Online (Sandbox Code Playgroud)

在第二种情况下,背景会在 之前 \n重置。

我的测试平台:Konsole 21.12.3 TERM=xterm-256color,.

  • @400 我不会称其为错误。当前的背景颜色会影响更多的东西:例如,在你的`printf“AAA\n”`使整个区域变成红色之后,`clear`。如果我“必须”将这两种行为之一称为“破坏”,那么我会说非底部行为是“破坏”。显然你不会同意。我可以在 `printf "AAA\n"` 之后用 `tput el` 修复我发现“损坏”的内容。确实,我发现这两种行为都被破坏了。我接受这样一个事实:“\n”在某些情况下会产生不同颜色的线条。终端已经是一个动物园,我们需要 `TERM`、`tput` 和 ncurses 等来可靠地与它们一起工作。 (5认同)