如何將轉義序列與常數字串進行比較?

如何將轉義序列與常數字串進行比較?

我想根據終端的背景顏色有條件地做一件事,我發現可以透過運行來掌握

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' ]

相關內容