试图了解在类似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):
问题:
供您参考,我已经在Mac OS Mojave Terminal和Ubuntu 18.04 Terminal上测试了此行为。我已经使用等效的Python 3脚本进行了测试。结果是一致的。我也尝试在C / C ++中使用fflush(stdout)
,但徒劳。
P.S。这个问题源于要在Mac或Linux上运行的C ++程序。我认为这与语言本身无关,因此我将其简化为bash脚本。 如果可能,请提出一种可以在C / C ++中完成的解决方案。
答案 0 :(得分:3)
您的问题是由终端滚动引起的。
当“青色”青色背景发出换行导致终端滚动时,插入的空白行的背景将填充当前已知的背景:青色。
然后重置颜色属性,并使用默认背景打印“返回正常”文本,但是未覆盖的行区域仍为青色。
您应该在到达行尾之前重置属性,如下所示:
#!/usr/bin/env sh
printf "\033[46m"
printf "On Cyan"
printf "\033[0m"
printf "\nBack to Normal\n"
或者,您可以在重置文本属性之后在行tput el
或printf "\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"