我想根據終端的背景顏色有條件地做一件事,我發現可以透過運行來掌握
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' ]