Existem vários aspectos em jogo no que você está perguntando.
Primeiro, o bash não define cores. De fato, o bash não tem absolutamente nenhuma idéia de que as cores existam. Tudo o que sabe é que você disse para enviar os caracteres \033[0;36m
. Seu emulador de terminal (xterm, gnome-terminal, qualquer que seja) recebe esses caracteres e entende "Preciso começar a produzir em ciano".
Portanto, é o seu emulador de terminal que entende as cores. O emulador de terminal entende que \033[0;36m
é ciano, mas outro emulador de terminal pode usar um conjunto de caracteres totalmente diferente para ciano (embora nenhum emulador de terminal sensato ostente o padrão e faça isso). Esta é a razão para tput
. Quando você executa tput setaf 6
, tput
procura os códigos de escape do seu terminal para a cor 6 (ciano) e gera esse código de saída.
(veja esta pergunta para mais informações sobre tput setaf
códigos)
Agora de volta ao bash. Como você deve ter notado, quando me refiro à cor ciano, uso \033[0;36m
, não \[\033[0;36m\]
. Os colchetes estão faltando. O objetivo dos colchetes é que, ao usar códigos de escape (cores) no prompt, o bash precise saber quais caracteres não são impressos (largura zero, na verdade, não mostram nada). Assim, você coloca caracteres não imprimíveis em \[
\]
. Se você remover esses caracteres, tudo poderá parecer funcionar bem no começo, mas você começará a encontrar todo tipo de estranheza quando seu comando exceder a largura do terminal. Isso ocorre porque, ao digitar, o bash precisa saber quando o comando deve passar para a próxima linha. Para fazer isso, calcula a largura do prompt e, em seguida, a largura de quanto você digitou.
Outra nota, sobre tput
. nãoCYAN="\[\033[0;36m\]"
é a mesma coisa que . Como acabamos de discutir, os colchetes são relevantes para o bash e só vão gerar os códigos de escape do terminal.CYAN="$(tput setaf 6)"
tput
Como os colchetes geralmente são relevantes apenas no prompt, se você estiver usando cores na saída de um script ou algo assim, não deve usá-las. Significando que, se você estiver usando cores para mais do que avisos, precisará definir várias variáveis. Um com colchetes para uso no prompt e outro sem para todo o resto. Embora você possa adicionar manualmente os colchetes toda vez que fizer referência a uma cor no prompt.
Para encurtar a história, você provavelmente deseja definir algo como:
local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
\e[1;30m
, por exemplo, não representam tecnicamente o cinza, mas sim o slot de cor geralmente exibido como cinza por um terminal. Os emuladores de terminal são livres para alterar as cores reais da tela e, frequentemente, os tornam uma opção configurável pelo usuário.