如何確定控制台輸出的目前顏色?
我知道,如果有可用的彩色終端,可以使用轉義字元為它的輸出著色。
但是有沒有可能找出輸出目前顯示為哪種顏色?或者更好的是,如果我現在輸出它,文本會是什麼顏色?
我要求在使用這些轉義字元時不要破壞任何以前的顏色設置。“預設前景色”轉義字元是從配色方案中獲取資訊,而不是在我更改之前的文本顏色。
一般來說,獲取目前顏色是不可能的。終端的控制序列處理髮生在終端“內部”,無論它發生在哪裡。使用終端仿真器,例如
xterm
提供核心虛擬終端的作業系統核心中內置的終端仿真器,仿真器的內部狀態,包括其目前“圖形再現”(即顏色和屬性)的概念,都在機器上本身並且在理論上是可訪問的。但是對於一個真正的終端,這個資訊是在通過串列鏈路連接的物理上獨立的機器上的某個 RAM 位置。也就是說,一些終端包括一種機制,用於讀取這些資訊作為其終端協議的一部分,通過該串列鏈路發送。它們提供程序可以發送到終端的控制序列,使其返回有關其內部狀態的資訊,作為終端輸入。 向您展示了終端仿真器響應
mikeserv
的控制序列。xterm
但這些是特定於xterm
. 例如,Linux 核心中的內置終端仿真器和各種 BSD 核心是不同的終端類型,根本不實現任何此類控制序列。整個家庭的真實終端也是如此。DEC VT525 終端實現了一種讀出機制,但具有一組與
xterm
. 一個發送 DECRQSS(請求選擇或設置)序列來請求目前的圖形再現,終端通過發送 DECRPSS(報告選擇或設置)來響應。具體來說:
- 主機發送:DCS
$
q
m
ST(以SGR的控制功能部分為設置的DECRQSS)- 終端響應: DCS
0
$
r
0
;
3
3
;
4
4
m
ST(DECRPSS 帶有 SGR 控制序列的參數和控制功能部分,用於設置目前前景和背景顏色)當然,仔細閱讀你的問題會發現,你再次在那些歐洲貨幣體系中揮舞著巧克力香蕉。您實際上想要做的是,您已經選擇了一個解決方案,然後詢問如何執行該解決方案的一部分,是在您編寫一些彩色輸出時*保留以前的狀態。*不僅有用於執行此操作的 DEC VT 控制序列,還有一個可被
xterm
各種核心內置終端仿真器辨識的 SCO 控制台終端序列,以及一個 termcap/terminfo 條目,告訴您它們對您的終端是什麼。termcap 條目是
sc
和rc
。terminfo 條目是save_cursor
和restore_cursor
。這些名稱在效果上有些誤導(儘管它們確實起到了警告的作用,即您依賴的是事實上的東西而不是法律上的東西)。實際的 DECSC、DECRC、SCOSC 和 SCORC 控制序列也會保存和恢復目前的圖形再現。鑑於您指向的文章都是關於從 shell 腳本生成控制序列的,您現在要查找的命令是
tput
.進一步閱讀
- 喬納森·德博因·波拉德。2007. 放下巧克力香蕉,遠離歐洲貨幣體系。. 經常給出答案。
- VT420 程序員參考手冊。EK-VT420-RM-002。1992 年 2 月。數字。
- VT520/VT525 影片終端程式器資訊。EK-VT520-RM。1994 年 7 月。數字。