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 %q
que cita a string).
Você precisa usar o read
comando 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 reply
lê 24 caracteres da resposta do terminal. O printf final mostra que reply
contém a string que você esperava. Então você pode comparar com ele:
[ "$reply" = $'\e]11;rgb:ffff/ffff/ffff\a' ]