我的終端模擬器中的顏色有問題。我用作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,因為我不想要任何不可讀的變體)
在這兩個地方,當用滑鼠選擇時,它會巧妙地適應並在反轉時保持可讀性。