Usando cores e formatação em shell scripts
Por Angelo Roberto Bonfieti Junior
Data de Publicação: 20 de Julho de 2007
Já se deparou com a necessidade (ou vontade) de destacar texto ou simplesmente fazer o output do seu script tornar-se visualmente chamativo ?
Normalmente programadores (especialmente em shell script) não adotam isso por gostarem do texto puro, da linha de comando. Telinha preta :)
Todavia, se você é daqueles que acredita que seus scripts podem ficar melhores com alguma "cosmética", acredite, eles ficam mesmo. Pelo menos visualmente.
Inserir cores e diferenciar texto pode ser interessante quando você quiser destacar um erro, evidenciar diferenças ou, simplesmente, chamar à atenção para algo importante.
Sendo assim, aqui vai uma dica para inserir cores em um script (ou texto):
Essa dica foi testada em vi e funciona legal em terminais que suportam o formato ANSI. Basta que você adicione uma certa sequência ao comando echo para alcançar seu objetivo.
A sintaxe genérica é:
echo "^[[#m<texto>"
Onde:
^[ é um caracter especial produzido pressionando Crtl-v e, em seguida, Esc;
O hash (#) é substituído por um número, dependendo do tipo de efeito que voce pretende adicionar ao seu texto;
O segundo [ e a letra m são caracteres normais;
Sendo assim, a sequencia
echo "^[[33mTestando apenas^[[0m"
ira mostrar o texto Testando apenas em amarelo
Enquanto a sequencia:
echo "^[[31m^[[1mTestando apenas^[[0m"
ira mostrar o texto Testando apenas em vermelho e negrito (um vermelho um pouco mais forte)
Para imprimir o resultado de uma variável, basta definí-la corretamente e não permitir que o comando echo a interprete. Assim, segue um exemplo de como imprimir a variável TESTE com fundo azul, texto vermelho, negrito e sublinhado:
TESTE="Testing Only"
echo "^[[4m^[[1m^[[44m^[[31m${TESTE}^[[0m"
Neste exemplo, alem de formatar o texto, também delimitei o início e fim do nome da variável com {} - isso para evitar qualquer erro de interpretação pelo echo e pelos caracteres especiais.
Note que eu sempre termino com a sequencia ^[[0m. Esse é o código passado ao echo que irá retornar seu cursor ao estado "normal", ou seja, como estava previamente (sem cores).
Abaixo anexo uma pequena tabela C de várias cores e formatos. Existem mais códigos, mas esse são os que eu mais utilizo. Sugiro que, se houver tempo e disposição, você descubra as outras combinações e possibilidades... ;)
Tabela de códigos:
CORES DE TEXTO
| PRETO | 30 |
| VERMELHO | 31 |
| VERDE | 32 |
| AMARELO | 33 |
| AZUL | 34 |
| MAGENTA | 35 |
| CIANO | 36 |
| BRANCO | 37 |
CORES DE FUNDO
| PRETO | 40 |
| VERMELHO | 41 |
| VERDE | 42 |
| AMARELO | 43 |
| AZUL | 44 |
| MAGENTA | 45 |
| CIANO | 46 |
| BRANCO | 47 |
MODOS ANSI
| NORMAL | 0 |
| NEGRITO | 1 |
| BAIXA INTENSID | 2 |
| ITALICO | 3 |
| SUBLINHADO | 4 |
| PISCANDO | 5 |
| PISCA RAPIDO | 6 |
| INVERSO | 7 |
| INVISIVEL | 8 |
Note que alguns comandos nativos do Unix, como cat e pg, por exemplo, já mostram o resultado formatado, ou seja, colorido. Outros comandos, como more irão mostrar o código completo. O interessante, aqui, é notar que no último exemplo (com variável), o cat naquele script exibira:
TESTE="Testing Only"
echo "${TESTE}"
Onde o texto ${TESTE} já será mostrado colorido.
Mas note também que um simples (e famoso) Crtl-c dessa sequência, seguido
de Ctrl-v no vi não irá funcionar. Isso porque os caracteres ^[ são
especiais e não um texto puro. Assim, é necessário que eles sejam "passados"
para o vi como tal... copiar o arquivo, ou fazer um cat dele direcionar a
saida para outro arquivo, no entanto, funcionam perfeitamente.
Boa programação e boa diversão :)
Veja a relação completa dos artigos da coluna Cantinho do Shell
Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS
Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.
Opinião dos Leitores
02 Dez 2009, 22:41
CORRIGINDO
==========
Valeu brow... me baseei no seu texto para formatar um enorme script que fiz, somente esses efeitos de piscar, etc que não funcionaram.
Tentei assim: echo "^[[5mMeu texto que pisca^[[0m"
Mesmo assim vlw
Abraços
25 Jul 2007, 12:58
Concordo com o Mascarenhas: o uso de variáveis no lugar do "hard code" é melhor por diversos motivos; um deles: pode-se unset as variáveis caso for conveniente desabilitar os recursos do terminal.
Eu acho + prático:
echo -e "\e[32;5;1m PISCANDO \e[m"
E se o bash estiver configurado com:
shopt -s xpg_echo
echo "\e[32;5;1m PISCANDO \e[m"
é o suficiente, dispensando o uso da opção -e .
22 Jul 2007, 15:42
Obrigada pela "dica"!
Gostaria de obter "dicas" também de inglês instrumental. O que fazer?
Já enviei mensagem oculta.
Obrigada!
Marisete
20 Jul 2007, 19:59
O mais correto e utilizar a opção -e do comando echo e informar valor octal do caractere ESCAPE da seguinte forma:
echo -e "\033[7m TESTE REVERSO \033[m"
ou se preferir:
ESC="\033"
echo -e "${ESC}[7m TESTE REVERSO{ESC}[m"
Porém, se você estiver no polo norte, sentado em frente a um terminal WYSE-60 (o primeiro terminal a gente nunca esquece), ligado à um servidor Linux na porta COM1, à incrível velocidade de 38400 bps, seu script irá falhar.
Para torna-lo portável utilize o comando tput para buscar as características, específicas de cada terminal no banco de dados TERMINFO.
Assim sendo o script ficaria:
VREV=`tput rev` # Reverso
VNOR=`tput sgr0` # Normal
VPIS=`tput blink` # Sublinhado
VBRI=`tput bold` # Escuro
FVMO=`tput setab 1` # Fundo vermelho
CVMO=`tput setaf 1` # Caracter Vermelho
....
....
....
echo "${VREV} REVERSO ${VNOR}"
echo "${VPIS} PISCANTE ${VNOR}"
echo "${VREV}${VPIS} REV E PISCANTE ${NOR}"
Tanto você quanto os esquimós ficarão felizes para sempre.
fernando.scheid @ G M A I L . C O M



