qod*_*nja 5 terminal escape-characters ansi-term
我正在研究使用 ANSI 代码的 shell 脚本,发现由于某种原因,根据您的终端/操作系统支持不同的转义代码。
在某些情况下,我意外地得到了未解析的垃圾转储,我假设这意味着我的终端(在 Mac OS 上)不支持所使用的转义代码,尽管在很多地方都读到了这些含义相同的内容:
27 = 033 = 0x1b = ^[ = \e
Run Code Online (Sandbox Code Playgroud)
在搜索中,我发现了有关检测斜杠转义支持的问题。
所选答案嗅探$TERM
要检测的值
case $TERM in
(|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac
Run Code Online (Sandbox Code Playgroud)
但我想知道这有多可靠。
是否有一种标准方法来检查转义码支持(主要针对 Bash),或者该脚本几乎是常规的?
对于其他寻找信息的人来说,这也是一本很好的读物。
您有具体的操作吗?
下面是使用Standout 模式的示例,该模式在许多终端上都会给出强烈的可见结果:
tput smso; echo hello, world; tput rmso
Run Code Online (Sandbox Code Playgroud)
该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.|
Run Code Online (Sandbox Code Playgroud)
可以在 中找到有趣的特征对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"
Run Code Online (Sandbox Code Playgroud)