使用“ \ 033 [0m””无法始终正确重置终端背景颜色

时间:2019-10-10 03:06:04

标签: 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 Terminal和Ubuntu 18.04 Terminal上测试了此行为。我已经使用等效的Python 3脚本进行了测试。结果是一致的。我也尝试在C / C ++中使用fflush(stdout),但徒劳。

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

1 个答案:

答案 0 :(得分:3)

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

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

然后重置颜色属性,并使用默认背景打印“返回正常”文本,但是未覆盖的行区域仍为青色。

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

#!/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"