Nomes de cores de terminal “amigáveis” em scripts de shell?

19

Estou ciente de bibliotecas em linguagens como Ruby e Javascript para tornar mais fácil colorir seus scripts de terminal usando nomes de cores como "vermelho".

Mas há algo assim para scripts de shell no Bash, ou no Ksh, ou o que for?

    
por themirror 26.09.2013 / 23:33

5 respostas

32

Você pode definir cores nos seus scripts bash da seguinte forma:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

E, em seguida, use-os para imprimir em suas cores necessárias:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."
    
por 26.09.2013 / 23:46
11

Você pode usar tput OR printf

Usando tput ,

apenas crie a função abaixo e use-a

shw_grey () {
    echo $(tput bold)$(tput setaf 0) $@ $(tput sgr 0)
}

shw_norm () {
    echo $(tput bold)$(tput setaf 9) $@ $(tput sgr 0)
}

shw_info () {
    echo $(tput bold)$(tput setaf 4) $@ $(tput sgr 0)
}

shw_warn () {
    echo $(tput bold)$(tput setaf 2) $@ $(tput sgr 0)
}
shw_err ()  {
    echo $(tput bold)$(tput setaf 1) $@ $(tput sgr 0)
}

você pode chamar a função acima usando shw_err "WARNING:: Error bla bla"

Usando printf

print red; echo -e "\e[31mfoo\e[m"
    
por 26.09.2013 / 23:44
7

No zsh :

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
    
por 27.09.2013 / 01:09
3

Para usos comuns simples (linha completa de texto em uma única cor, com nova linha), modifiquei o código de jasonwryan da seguinte forma:

#!/bin/bash

red='\e[1;31m%s\e[0m\n'
green='\e[1;32m%s\e[0m\n'
yellow='\e[1;33m%s\e[0m\n'
blue='\e[1;34m%s\e[0m\n'
magenta='\e[1;35m%s\e[0m\n'
cyan='\e[1;36m%s\e[0m\n'

printf "$green"   "This is a test in green"
printf "$red"     "This is a test in red"
printf "$yellow"  "This is a test in yellow"
printf "$blue"    "This is a test in blue"
printf "$magenta" "This is a test in magenta"
printf "$cyan"    "This is a test in cyan"
    
por 24.12.2015 / 22:59
2

Melhor é usar tput , que manipulará caracteres de escape, dependendo dos recursos de saída / terminal. (Se um terminal não puder interpretar \e[* códigos de cores, ele será "poluído", o que dificulta a leitura da saída. (Ou, às vezes, se você grep dessa saída, verá esses \e[* nos resultados)

Veja este tutorial para tput .

Você pode escrever:

blue=$( tput setaf 4 ) ;
normal=$( tput sgr0 ) ;
echo "hello ${blue}blue world${normal}" ;

Aqui está um tutorial para imprimir um relógio colorido no terminal.

Além disso, observe que tput ainda pode imprimir caracteres de escape ao redirecionar STDOUT para um arquivo:

$ myColoredScript.sh > output.log ;
# Problem: output.log will contain things like "^[(B^[[m"

Para evitar que isso aconteça, configure suas variáveis tput como propostas em esta solução .

    
por 11.05.2017 / 18:51