我想根据我的终端的背景颜色有条件地做一件事,我发现可以通过运行来掌握
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' ]