Recentemente, tenho jogado muito com cor no terminal e, portanto, com sequências de escape também. Eu li as partes relevantes do manpage Bash, juntamente com inúmeras páginas úteis na Net.
Eu tenho mais do que eu quero trabalhar; uma cor agradável Bash prompt, por exemplo. Dito isso, ainda estou um pouco confuso sobre quando devo usar (ou preciso usar) os caracteres "sequência de escape sem impressão". Aqueles seriam \[
e \]
.
Se eu não usá-los no PS1 ao definir meu prompt, meu prompt definitivamente não será exibido corretamente. Se eu usá-los, tudo está bem. Bom.
Mas, fora do PS1, eles não parecem funcionar da mesma maneira. Por exemplo, para tornar os scripts mais legíveis, defini uma variável $RGB_PURPLE
, que é definida por meio de uma função simples c8_rgb()
. O resultado final é que a variável contém o valor \[\e[01;38;05;129m\]
que ativa uma cor de primeiro plano púrpura em negrito.
Quando eu uso essa variável no PS1, ela faz o que eu espero. Se eu usá-lo via printf
ou echo -e
, "metade" funciona. O comando printf "${RGB_PURPLE}TEST${COLOR_CLR}\n"
(onde COLOR_CLR
é a seqüência de escape para redefinir propriedades de texto) resulta na seguinte exibição: \[\]TEST\[\]
, em que tudo, exceto o primeiro \[
e o final \]
, são exibidos em roxo.
Por que a diferença? Por que esses suportes são impressos em vez de serem processados pelo terminal? Eu esperava que eles fossem tratados da mesma forma quando impressos como parte do prompt, quando impressos por outros meios. Eu não entendo a mudança.
Parece, empiricamente, que esses caracteres devem ser usados dentro da definição do prompt, enquanto não devem ser usados em praticamente todos os outros casos. Isso dificulta o uso de uma função comum, como minha função c8_rgb()
mencionada acima, para manipular a geração e a saída da seqüência de escape, pois a função não pode saber se seu resultado estará em uma configuração de prompt ou em outro lugar.
E uma rápida pergunta relacionada: echo -e
e printf
são essencialmente os mesmos no que diz respeito à saída de seqüências de escape? Eu normalmente uso printf, mas há algum motivo para favorecer um sobre o outro?
Alguém pode explicar essa aparente diferença sutil? Existem outras esquisitices que eu deveria estar ciente ao usar seqüências de escape (geralmente apenas para cor) no terminal? Obrigado!