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