エスケープシーケンスを定数文字列と比較するにはどうすればよいでしょうか?

エスケープシーケンスを定数文字列と比較するにはどうすればよいでしょうか?

端末の背景色に基づいて条件付きで何かを行いたいのですが、これは次のコマンドを実行することで実現できることが分かりました。

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文字列を引用符で囲むフォーマットの結果です)。

ターミナルからの応答をキャプチャするには、シェルの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' ]

関連情報