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

22

Eu usei de vez em quando cores no script Bash (principalmente no CentOS), mas para tornar seu uso mais conveniente acabei redefinindo variáveis para valores de cores:

local GRAY="\[3[1;30m\]"
local LIGHT_GRAY="\[3[0;37m\]"
local CYAN="\[3[0;36m\]"
local LIGHT_CYAN="\[3[1;36m\]"
local NO_COLOUR="\[3[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 mostrei o diretório /etc/rc.d/init.d , mas não encontrei nada relacionado a definições de cores.

Existe tal definição já em vigor? Se não, eu os colocaria em um arquivo em /etc/rc.d/init.d , digamos, e os incluiria em meus scripts, um pouco como com /etc/rc.d/init.d/functions

    
por fduff 30.09.2014 / 14:41

2 respostas

34

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\]"
    
por 30.09.2014 / 15:59
7

Se você quiser algo assim, basta adicionar as linhas ao seu ~/.profile :

GRAY="\[3[1;30m\]"
LIGHT_GRAY="\[3[0;37m\]"
CYAN="\[3[0;36m\]"
LIGHT_CYAN="\[3[1;36m\]"
NO_COLOUR="\[3[0m\]"

Ou, para tê-los sob demanda, adicione-os a um arquivo no seu $HOME e insira-o em seus scripts:

. ~/.mycolors

Para disponibilizá-los globalmente, adicione a /etc/profile . Em qualquer caso, esse tipo de coisa não tem absolutamente nenhum negócio em /etc/rc.d/init.d . Esse diretório é para os scripts de configuração do daemon de inicialização e não tem nada a ver com a configuração de suas variáveis de shell.

    
por 30.09.2014 / 15:23