如何将转义序列与常量字符串进行比较?

如何将转义序列与常量字符串进行比较?

我想根据我的终端的背景颜色有条件地做一件事,我发现可以通过运行来掌握

printf '\e]11;?\a'

就我而言,输出是

stanton@mybox:~$ printf '\e]11;?\a'
^[]11;rgb:ffff/ffff/ffff^Gstanton@mybox:~$ 11;rgb:ffff/ffff/ffff

这已经让人困惑了。无论如何,我想运行一个测试

[ "$(printf '\e]11;?\a')" = "^[]11;rgb:ffff/ffff/ffff^G" ] && echo it\'s light || echo it\'s dark

但它不起作用。(我尝试了我能想到的任何可能的字符串变体,带或不带转义序列等,但都没有结果。)

我要做什么才能比较 printf 和字符串的输出?

答案1

问题是你不想要 的输出printf,而是想要终端的回复。你$(...)不会评估这个回复,正如我们所见:

$ v=$(printf '\e]11;?\a')
$ printf "%q\n" "$v"
$'\E]11;?\a'

变量 v 与第一个 printf 的输出相同($'...' 是%q引用字符串的格式的结果)。

您需要使用 shell 的read命令来捕获来自终端的回复。例如,使用 bash:

$ read  -n 24 -p "$v"  reply
$ printf "%q\n" "$reply"
$'\E]11;rgb:ffff/ffff/ffff\a'

这里-p用于打印变量$v,变量reply从终端响应中读取 24 个字符。最后的 printf 显示reply保存了您预期的字符串。因此您可以与之进行比较:

[ "$reply" = $'\e]11;rgb:ffff/ffff/ffff\a' ]

相关内容