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 %q
que cita la cadena).
Debe utilizar el read
comando 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í -p
se utiliza para imprimir la variable $v
, y la variable reply
lee 24 caracteres de la respuesta del terminal. El printf final muestra que reply
contiene la cadena que esperaba. Entonces puedes comparar con él:
[ "$reply" = $'\e]11;rgb:ffff/ffff/ffff\a' ]