¿Cómo comparar una secuencia de escape con una cadena constante?

¿Cómo comparar una secuencia de escape con una cadena constante?

Quería hacer algo basado condicionalmente en el color de fondo de mi terminal, y descubrí que se puede entender ejecutando

printf '\e]11;?\a'

En mi caso la salida es

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

lo cual ya es confuso. De todos modos, pensé en realizar una prueba como

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

pero no funciona. (Probé cualquier posible variación de la cadena que me vino a la mente, con o sin secuencias de escape, etc., sin resultado).

¿Qué tengo que hacer para comparar la salida de printf y una cadena?

Respuesta1

El problema es que no desea la salida de printf, sino la respuesta del terminal. Tu $(...)no evalúa esta respuesta, como podemos ver:

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

La variable v es la misma que la salida del primer printf (el $'...' es el resultado del formato %qque cita la cadena).

Debe utilizar el readcomando del shell para capturar la respuesta del terminal. Por ejemplo, con bash:

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

Aquí -pse utiliza para imprimir la variable $v, y la variable replylee 24 caracteres de la respuesta del terminal. El printf final muestra que replycontiene la cadena que esperaba. Entonces puedes comparar con él:

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

información relacionada