As seqüências de escape de cores do terminal são definidas em algum lugar para o bash?

22

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.ddiretó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.dpor exemplo, e o incluiria nos meus scripts, um pouco como em/etc/rc.d/init.d/functions

fduff
fonte
Eles não são, porque \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.
chepner

Respostas:

36

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, tputprocura 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 setafcó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\]"
Patrick
fonte
Como, então, vejo as cores ao fazer login em um terminal real com Ctrl+ Alt+ F1?
Serge Stroobandt 26/09