我的终端模拟器中的颜色有问题。我用作LXTerminal
我的终端模拟器和LXDE
桌面环境。
以下命令应该在灰色背景上打印红色文本:
printf "\n\033[1;31;40m"hello"\033[00m\n\n"
但这不起作用。灰色背景缺失(红色文本也可以)。在我的旧机器上 ( Gnome/Gnome Terminal
) 一切正常
我尝试安装其他几个终端模拟器,但问题仍然存在。我什至不确定这个问题是否与终端模拟器有关,或者其他什么。在控制台 (CTRL+ALT+F1) 中,背景灰色在任何一台机器上都不起作用)
此问题仅限于灰色背景。所有其他颜色都可以正常工作,例如以下在绿色背景上打印红色文本。
printf "\n\033[1;31;42m"hello"\033[00m\n\n"
我将不胜感激任何帮助。我什至不知道从哪里开始排除故障。
答案1
每个终端仿真器都支持八种标准 ANSI 颜色。大多数终端仿真器还具有标准 ANSI 颜色的八种明亮变体。
然而,转义码映射到的实际颜色值并未标准化,而且事实上,它们在终端仿真器之间通常略有不同。因此,如果您printf "\e[31;47mTest\n"
在白色背景上打印红色文本,则根据您使用的终端模拟器,您获得的实际红色和白色色调可能会有所不同。
因此,这部分解释了问题:颜色值不是标准的,并且LXTerminal
可能有您不习惯的不同默认调色板。如果您查看设置,通常您可以将配色方案配置为您喜欢的任何颜色。
您面临的另一个问题是粗体属性的实际作用也不是标准化的。有三种可能性:可以使字体加粗,可以使前景色更亮,或者既可以使前景色更亮又可以使字体加粗。
同样,这里的默认行为因终端模拟器而异,如果您能找到正确的设置,通常可以更改它。 Grep 查找提及“大胆”或“明亮”的内容。
如果您想使用明亮的颜色,那么您可以使用所谓的 aixterm 颜色转义代码而不是粗体。这些不是标准的,但我知道的每个现代终端模拟器都支持它们。与粗体不同,它们总是使用明亮的颜色,而且它们可以用来显示明亮的背景颜色。
例如,如果您想在亮白色背景上打印亮红色文本,您可以这样做:printf "\e[91;107mTest\n"
。
作为参考,下面是所有颜色转义代码的表格:
| ANSI | ANSI | ANSI | | Aixterm | Aixterm
| Color | FG Code | BG Code | Bright Color | FG Code | BG Code
+---------+---------+-------- +----------------+---------+--------
| Black | 30 | 40 | Bright Black | 90 | 100
| Red | 31 | 41 | Bright Red | 91 | 101
| Green | 32 | 42 | Bright Green | 92 | 102
| Yellow | 33 | 43 | Bright Yellow | 93 | 103
| Blue | 34 | 44 | Bright Blue | 94 | 104
| Magenta | 35 | 45 | Bright Magenta | 95 | 105
| Cyan | 36 | 46 | Bright Cyan | 96 | 106
| White | 37 | 47 | Bright White | 97 | 107
答案2
1
开头的属性打开1;31;40
“粗体”(又名“明亮”)模式,但某些终端仅将其应用于前景色。我不知道出于什么原因(并且更改 $TERM 变量没有区别),因为它们确实支持前景中的 16 种颜色。1 0(来自40
:4 = 背景,0 = 颜色)实际上是黑色,但“亮黑色”是灰色。这里有两个解决方案:
颜色 7(白色)可能会变成灰色,而不是白色(对于真正的白色,您需要“亮白色”,这意味着您实际上不能拥有的背景是白色)。
如果需要,您应该能够在 LXDE 中使用 gnome 终端。只需安装它并开始
gnome-terminal
(我相信这是它的命令名称)。然后你必须配置任何启动器来使用它而不是 lx 终端。
1这是我的猜测:请注意,设置粗体会将亮度应用于前景色和添加了大胆的强调。因此,如果不应用粗体,就无法使用明亮的前景色。大概在单色终端很常见的时候,只是简单地设置粗体来强调,例如:\\033[1mBlah blah\\033[0m
很常见——事实上这仍然有效,但它也会使你的前景色明亮。如果我们认为这也使背景变亮是不可取的(因为它应该是粗体的),那么我们将确保实现不会这样做。那好吧。
答案3
这是一个可以与某些终端模拟器一起使用的技巧。通过使用反相视频属性(7)选择明亮的前景色,然后将其与背景颜色交换,它将为您提供明亮的背景颜色。
echo -e "\e[1;32;7mText on a bright green background"
问题是,虽然您现在可以有 16 种背景颜色,但 8 种颜色的限制现在适用于前景/文本。更令人困惑的是,当反相视频属性处于活动状态时,您必须使用背景颜色的属性代码来设置文本颜色!
答案4
而47=background white
不是40=background black
你得到非粗体白色作为背景。
]# printf "\033[0;30;47m"hello"\033[00m\n"
hello (black on grey)
]# printf "\033[1;30;47m"hello"\033[00m\n"
hello (darkgrey on grey)
]# printf "\033[1;37;47m"hello"\033[00m\n"
hello (white on grey)
]# printf "\033[0;37;47m"hello"\033[00m\n"
hello (INVISIBLE grey on grey)
默认情况下,粗体黑色会产生深灰色。正常的白色实际上是灰色的,因为粗体白色是白色。
此循环打印两列,其中包含所有黑底彩色和彩色白底组合。
for ((i=30; i<=47; i++))
do
echo -en "\e[${i}mHello\e[0m";
echo -e "\e[1;${i}mHello\e[0m";
done
它以看不见的黑色和黑底深灰开始,但其他 17 行看起来不错,它显示了整个控制台的调色板。
(38 和 39 应该被忽略,但是为了简单起见我只取 30 到 47)
接受 A. 提及八颜色和缺乏标准。
六种颜色 31-36(红色到青色)定义明确。也有黑色 (30) 和白色 (37),但它们的粗体变体较少,特别是作为背景(40 和 47)。
我只是注意到:在 xterm 中,正常的白色文本在灰色背景上可见,但在 Linux 控制台中则不然。 (最后一行,i=47)(直到 30 分钟前,脚本停在 46,因为我不想要任何不可读的变体)
在这两个地方,当用鼠标选择时,它会巧妙地适应并在反转时保持可读性。