Existem alguns problemas fundamentais com esta questão:
-
Para que isso resulte em uma solução geral, o comando deve ser suportado por ANSI X3.64 , padrão básico para todos os terminais modernos , mas Tanto quanto eu posso dizer, isso não é um comando ANSI.
Eu não tenho certeza porque não tenho uma cópia desse padrão, não consigo encontrar um on-line e o ANSI não sell eu um . Tudo o que posso encontrar on-line são bastardized "referências". Como eu descrevo em outro lugar , enquanto X3. 64 é o padrão de raiz de todos os terminais modernos comuns, essa observação é um pouco como mostrar que os cães descendem dos lobos: estudar lobos para aprender sobre cães impõe severas limitações ao escopo das coisas que você pode aprender.
O melhor recurso que encontrei é a referência Sequências de Controle XTerm , mantida pela% atual
xterm
mantenedor. Mas, este não é um padrão normativo, apenas descreve o que um programa comum faz. Muitos programas são derivados do código-fontexterm
, mas, como os cães dos lobos, muitos divergiram significativamente.Eu suspeito que você encontraria, se você o perseguisse, que este comando foi introduzido por xterm como uma extensão para ANSI X3.64 e seu terminal de destino não suporta essa extensão
xterm
específica, e é por isso quextermcontrol
falha. -
Mesmo que o seu conjunto particular de terminais dê uma resposta a esse comando, não vejo os acima -referenciado documento que você vai obter um valor RGB. Você pode muito bem ter um nome de cor.
(Esse é o tipo de detalhe que esperamos que um padrão normativo descubra, que é frequentemente negligenciado em documentos de descrição funcional.)
Além disso, tenha em atenção que, mesmo que receba uma resposta R; G; B, a resposta pode variar. Se você definir sua cor usando os antigos códigos de cores ANSI X3.64, não há nenhum padrão dizendo a cor RGB para a qual eles mapeiam; de fato, todo programa de terminal familiar
xterm
que eu já usei, dá um jeito de mudar as cores RGB usadas para os códigos de cores ANSI. Além disso, você pode alterar esses valores rapidamente em alguns programas de terminal, para que duas execuções de programa separadas por uma execução de programa de terceiros possam dar respostas diferentes, porque o esquema de cores agora é diferente.
Existe outra resposta na rede SE que faz aproximadamente a mesma coisa que sua instrução print
faz, mas como seu comando, o comando echo
da outra resposta não recebe resposta do Terminal do OS X, que afirma ser um xterm-256color
terminal. Isso significa que a solução nem funciona para todos os terminais da família xterm.
Eu escrevi um programa C mais robusto que diagnostica o erro se isso acontecer, e se não, mostra os valores de retorno em formato imprimível. Você pode achar que é uma base mais adequada para extensões do que comandos shell:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char reply[40];
size_t nr;
void timeout(int sn)
{
if (nr > 0) {
for (size_t i = 0; i < nr; ++i) {
printf("Got char %d\n", reply[i]);
}
if (!sn) puts("WARNING: Buffer filled!");
}
else {
puts("No reply from terminal.");
}
exit(0);
}
int main(void)
{
signal(SIGALRM, timeout);
alarm(1);
printf("\e]11;?\a");
for (nr = 0; nr < sizeof(reply); ++nr) {
reply[nr] = getchar();
}
timeout(0); /* buffer filled before alarm() timer went off! */
return 0;
}