Existem vários aspectos em jogo no que você está perguntando.
Primeiro, o bash não define cores. Na verdade, bash não faz a menor ideia de que as cores existem. Tudo o que você sabe é que você disse para exibir os caracteres 3[0;36m
. Seu emulador de terminal (xterm, gnome-terminal, o que quer que seja) recebe esses caracteres e entende "Preciso iniciar a saída em ciano".
Assim, é o seu emulador de terminal que entende as cores. O emulador de terminal entende que 3[0;36m
é ciano, mas outro emulador de terminal pode usar um conjunto totalmente diferente de caracteres para ciano (embora nenhum emulador de terminal sã exiba o padrão e faça isso). Esse é o motivo para tput
. Quando você executar tput setaf 6
, tput
procurará os códigos de escape do seu terminal para a cor 6 (ciano) e exibirá esse código de escape.
(consulte esta questão para mais informações sobre tput setaf
codes)
Agora de volta ao bash. Como você deve ter notado, quando estou me referindo à cor ciano, estou usando 3[0;36m
, não \[3[0;36m\]
. Os colchetes estão faltando. O objetivo dos colchetes é que, ao usar códigos de escape (cores) no prompt, o bash precisa saber quais caracteres não estão sendo impressos (largura zero, na verdade, não mostram nada). Assim, você coloca os caracteres não imprimíveis em \[
\]
. Se você remover esses caracteres, tudo parecerá funcionar bem no início, mas você começará a se deparar com todos os tipos 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, ele calcula a largura do prompt e, em seguida, a largura de quanto você digitou.
Outra nota, sobre tput
. CYAN="\[3[0;36m\]"
é não a mesma coisa que CYAN="$(tput setaf 6)"
. Como acabamos de discutir, os colchetes são relevantes para bash, e tput
só vai produzir os códigos de escape do terminal.
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 deverá usá-los. Isso significa que, se você usar cores para mais de prompts, precisará definir várias variáveis. Um com colchetes para usar 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 quer definir algo como:
local CYAN="$(tput setaf 6)" # OR CYAN="3[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="3[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"