Terminal

以程式方式檢測終端支持的 ANSI 轉義碼

  • March 8, 2021

我正在使用使用 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),或者該腳本幾乎可以執行?

  • 或者,我可以使用什麼轉義碼來“保證”最廣泛的支持?
  • 迴聲擴展 -e 怎麼樣?
  • 對於使用或引用控制程式碼的腳本,在可移植性/可用性/分發方面的一般最佳實踐是什麼?

對於其他尋找資訊的人來說,這也是一本不錯的讀物。

你有沒有想過具體的操作?

這是一個使用standout mode的範例,它在許多終端上會產生強烈的可見效果:

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"

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