Eu sempre utilizava cores no script Bash (principalmente no CentOS), mas, para tornar seu uso mais conveniente, acabo redefinindo variáveis para valores de cores:
local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"
ou também com tput
:
bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`
Eu andei pelo /etc/rc.d/init.d
diretório, mas não encontrei nada relacionado às definições de cores.
Já existe essa definição? Caso contrário, eu os colocaria em um arquivo, /etc/rc.d/init.d
por exemplo, e o incluiria nos meus scripts, um pouco como em/etc/rc.d/init.d/functions
\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.Respostas:
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 paratput
. Quando você executatput 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:
fonte
Ctrl
+Alt
+F1
?