以程式設計方式偵測終端支援的 ANSI 轉義碼

以程式設計方式偵測終端支援的 ANSI 轉義碼

我正在研究使用 ANSI 程式碼的 shell 腳本,發現由於某種原因,根據您的終端/作業系統支援不同的轉義程式碼。

在某些情況下,我意外地得到了未解析的垃圾轉儲,我假設這意味著我的終端(在Mac OS 上)不支援所使用的轉義程式碼,儘管在很多地方都讀到了這些含義相同的內容:

27 = 033 = 0x1b = ^[ = \e

在搜尋中我發現這個關於偵測斜線轉義支援的問題

所選答案嗅探$TERM要偵測的值

case $TERM in
  (|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
    PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac

但我想知道這有多可靠。

是否有一種標準方法來檢查轉義碼支援(主要針對 Bash),或者該腳本幾乎是常規的?

  • 或者,我可以使用什麼轉義代碼來「保證」最廣泛的支援?
  • echo 擴充 -e 怎麼樣?
  • 在可攜性/可用性/分發方面的一般最佳實踐是什麼腳本那就使用或參考控製代碼?

這是也很好讀對於任何其他正在尋找資訊的人。

答案1

您有具體的操作嗎?

這是一個使用的例子突顯模式,在許多終端上都會給出強烈的可見結果:

tput smso; echo hello, world; tput rmso

tput工具使用環境變數的值$TERM來確定要輸出的轉義序列(如果有)。例如

TERM=xterm
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  1b 5b 37 6d 68 65 6c 6c  6f 2c 20 77 6f 72 6c 64  |.[7mhello, world|
00000010  0a 1b 5b 32 37 6d                                 |..[27m|

TERM=dumb
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  68 65 6c 6c 6f 2c 20 77  6f 72 6c 64 0a           |hello, world.|

有趣的特徵對可以在以下位置找到man 5 terminfo,其中一些如下:

  • 突出:smsormso
  • 底線:smulrmul
  • 眨眼(是的!):blink
  • 雙寬:swidmrwidm
  • 反向:rev
  • 全部取消:sgr0

如果您想編寫粗體文本,但前提是終端能夠理解它,那麼這樣的程式碼片段就可以工作

boldOn=$(tput smso)
boldOff=$(tput rmso)
# ...
printf "%s%s%s\n" "$boldOn" 'This message will be in bold, when available' "$boldOff"

答案2

實際上,可以詢問 DEC 終端(及其克隆和仿真,包括 xterm)的功能;只是與個人轉義序列支援(或其完整性)無關。 UNIX 通常不使用此功能,而是依賴 termcap/terminfo 資料庫(也記錄了這些怪癖)。

作為參考,序列是 DA(“設備屬性”,ANSI 標準)和 DECID(“識別終端”,DEC 私有)。

相關內容