Como comparar uma sequência de escape com uma string constante?

Como comparar uma sequência de escape com uma string constante?

Eu queria fazer algo condicionalmente com base na cor de fundo do meu terminal, que descobri que pode ser compreendida executando

printf '\e]11;?\a'

No meu caso a saída é

stanton@mybox:~$ printf '\e]11;?\a'
^[]11;rgb:ffff/ffff/ffff^Gstanton@mybox:~$ 11;rgb:ffff/ffff/ffff

o que já é confuso. De qualquer forma, pensei em fazer um teste como

[ "$(printf '\e]11;?\a')" = "^[]11;rgb:ffff/ffff/ffff^G" ] && echo it\'s light || echo it\'s dark

mas não funciona. (Tentei qualquer variação possível da string que me veio à mente, com ou sem sequências de escape, etc., sem resultado.)

O que preciso fazer para comparar a saída de printf e uma string?

Responder1

O problema é que você não quer a saída printf, mas sim a resposta do terminal. Você $(...)não avalia esta resposta, como podemos ver:

$ v=$(printf '\e]11;?\a')
$ printf "%q\n" "$v"
$'\E]11;?\a'

A variável v é igual à saída do primeiro printf (o $'...' é o resultado do formato %qque cita a string).

Você precisa usar o readcomando do shell para capturar a resposta do terminal. Por exemplo, com bash:

$ read  -n 24 -p "$v"  reply
$ printf "%q\n" "$reply"
$'\E]11;rgb:ffff/ffff/ffff\a'

Aqui -pé usado para imprimir a variável $v, e a variável replylê 24 caracteres da resposta do terminal. O printf final mostra que replycontém a string que você esperava. Então você pode comparar com ele:

[ "$reply" = $'\e]11;rgb:ffff/ffff/ffff\a' ]

informação relacionada