無法將亮度套用至終端的背景顏色

無法將亮度套用至終端的背景顏色

我的終端模擬器中的顏色有問題。我用作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,因為我不想要任何不可讀的變體)

在這兩個地方,當用滑鼠選擇時,它會巧妙地適應並在反轉時保持可讀性。

相關內容