c - 终端背景颜色并不总是使用 "\033[0m"正确重置

标签 c bash macos unix terminal

尝试了解在类 Unix 操作系统(Mac、Linux)上重置背景颜色时的终端行为。

考虑一个 bash 脚本

#!/usr/bin/env bash

printf "\033[46m"
printf "On Cyan\n"
printf "\033[0m"
printf "Back to Normal\n"

当我最初运行这个脚本时,一切都符合预期。但是,如果我重复几次,打印结果就会改变。 “Back to Normal” 之后是青色背景色的线条。

屏幕截图(终端,Mac OS Mojave):

enter image description here

问题:

  1. 这是为什么?谁能解释这种行为?
  2. 如果我更改了背景颜色并打印了一行(以换行符结尾),我该怎么做才能正确重置背景并避免这种不需​​要的尾随背景颜色?

供您引用,我已经在 Mac OS Mojave 终端和 Ubuntu 18.04 终端上测试了此行为。我已经使用等效的 Python 3 脚本进行了测试。结果是一致的。我也尝试在 C/C++ 中使用 fflush(stdout) 但没有成功。

附言这个问题源于要在 Mac 或 Linux 上运行的 C++ 程序。我认为它与语言本身无关,所以我将它简化为一个 bash 脚本。 如果可能,请提出一个可以用 C/C++ 完成的解决方案。

最佳答案

您的问题是由终端滚动引起的。

当您的“On Cyan”青色背景发出导致终端滚动的换行符时,插入的空白行的背景将填充当前已知的背景:青色。

然后您重置颜色属性,您的“恢复正常”文本将以默认背景打印,但未被覆盖的线条区域仍然是青色。

您应该在到达行尾之前重置属性,如下所示:

#!/usr/bin/env sh

printf "\033[46m"
printf "On Cyan"
printf "\033[0m"
printf "\nBack to Normal\n"

或者,您可以在重置文本属性后向行尾发出清除 tput elprintf "\033[K":

#!/usr/bin/env sh

printf "\033[46m" # same as tput setab 6
printf "On Cyan\n"
printf "\033[0m\033[K" # same as tput -S <<<$'sgr0\nel'
printf "Back to Normal\n"

关于c - 终端背景颜色并不总是使用 "\033[0m"正确重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58314879/

相关文章:

linux - 将 chroot 应用于组时出错(groupmod : group 'www' does not exist)

c# - 如何在 Mac OS X 上的 VSCode 项目中包含 'System.Runtime.Serialization.Json' 命名空间?

C 使用多个本地 ip 之一进行 DNS 查询

用于 C 程序的 C# GUI

bash - 如何在composer之前使用各自的php版本名称

linux - 为什么ln不显示../..?

c - Linux C 使用信号和管道在进程间通信

c - STM32运行异步函数

objective-c - 打开多个文件的大中央策略

macos - 用于分发到 Mac 的 DMG 或 Zip 文件?