Terminal
以程式方式檢測終端支持的 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),或者該腳本幾乎可以執行?
- 或者,我可以使用什麼轉義碼來“保證”最廣泛的支持?
- 迴聲擴展 -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
,其中一些如下:
- 突出:
smso
和rmso
- 下劃線:
smul
和rmul
- 眨眼(是的!):
blink
- 雙寬:
swidm
和rwidm
- 逆轉:
rev
- 全部取消:
sgr0
如果你想寫粗體文本,但前提是終端理解它,那麼這樣的片段就可以了
boldOn=$(tput smso) boldOff=$(tput rmso) # ... printf "%s%s%s\n" "$boldOn" 'This message will be in bold, when available' "$boldOff"