无法将亮度应用于终端的背景颜色

无法将亮度应用于终端的背景颜色

我的终端模拟器中的颜色有问题。我用作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,因为我不想要任何不可读的变体)

在这两个地方,当用鼠标选择时,它会巧妙地适应并在反转时保持可读性。

相关内容