Bash

在終端中設置、備份和恢復顏色

  • August 16, 2015

我使用這個程序來顯示終端中所有可用的顏色。我得到的就是:

在此處輸入圖像描述

  1. 這個程序不顯示低於 100 的顏色。為什麼?有沒有辦法顯示它們。
  2. 是否可以更改某些 #rrggbb 值的第 n 個顏色?或者這是預定義的顏色?
  3. 如果我可以改變顏色(見問題 2),有沒有辦法導出和導入這些值?

支持多少種顏色以及如何更改前景色和背景色取決於終端。

terminfo數據庫通常可以幫助您提出正確的序列。

大多數顏色終端支持 ANSI 顏色轉義序列以將前景色和背景色更改為 0 到 7

那是:

  • 設置前景色*$n*:printf "\33[3${n}m"
  • 設置背景顏色*$n*:printf "\33[4${n}m"

一些(罕見的)終端(如emu)對這些 ANSI 顏色使用不同的序列。

一些(罕見的)終端,如 QNX 控制台,具有不同的轉義序列和不同的顏色。

一些(罕見)使用顏色對。您為背景和前景定義了一個顏色對,然後有一個轉義序列來選擇您要使用的顏色對。

現在,xterm 和大多數現代自由軟體終端仿真器將基本的 8 種 ANSI 顏色擴展到多達 16 種(其中 8 到 15 是 ANSI 顏色 0 到 7 的更亮版本)、88 或 256 種顏色。

有些終端rxvt只支持 8 種顏色,但如果粗體也打開(用於前景)或閃爍(用於背景),則使用較亮的顏色。\033[34;1m會給出比 更亮的藍色\033[34m

使用顏色最便攜的方法是使用 terminfo 數據庫。

它可以通過tput命令。tcsh並且zsh還有一個echoti內置的。

如果 terminfo 數據庫是正確的,並且值$TERM正確反映了您正在使用的終端:

tput colors

將為您提供終端支持的顏色數量。

如今,除了上面提到的極少數例外,您可以假設您的終端將支持 ANSI 顏色。ANSI 背景和前景色的 terminfo 功能是setabsetaf。如果終端支持超過 8 種顏色,您仍然可以使用該功能來查詢它們。

tput setaf 233

如果終端支持 256 色,則應為該顏色 233 輸出正確的轉義序列。

對於xterm,顏色 0 到 7、顏色 8 到 15 和顏色 16 到 255 的setaf輸出。\033[30m..\033[37m``\033[90m..\033[97m``\033[38;5;16m..\033[38;5;255m

\033[38;5;0m..\033[38;5;15m也可以工作,但比顏色 0 到 15 的更便攜的等價物長 4 個字節。

因此,要測試終端支持的所有顏色。如果它支持 ansi 顏色:

i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
 tput setaf "$i"; printf %04d "$i"
 i=$((i + 1))
done

如果它支持其他顏色:

i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
 tput setf "$i"; printf %04d "$i"
 i=$((i + 1))
done

如果它適用於顏色對(如 hpterm-color):

i=0; n=$(tput pairs); while [ "$i" -lt "$n" ]; do
 tput scp "$i"; printf %04d "$i"
 i=$((i + 1))
done

現在,要重新定義顏色或顏色對,這在終端之間也會有所不同。

有一個initcterminfo 功能可以為那些可以做到這一點的終端重新定義給定的顏色。並initp重新定義一對。

例如將顏色 1 重新定義為亮白色:

tput initc 1 1000 1000 1000

使用xterm, 發送序列:\033]4;1;rgb:FF/FF/FF\033\.

要在使用對的終端上將顏色對 1 重新定義為黑底白字:

tput initp 1 1000 1000 1000 0 0 0

引用自:https://unix.stackexchange.com/questions/219637