¿Nombres de color de terminal "amigables" en los scripts de shell?

25

Conozco bibliotecas en lenguajes como Ruby y Javascript para facilitar la coloración de sus scripts de terminal utilizando nombres de colores como "rojo".

¿Pero hay algo como esto para los scripts de shell en Bash, o Ksh, o lo que sea?

el espejo
fuente
8
marque una respuesta como correcta ... ¡hasta ahora solo marcó 1 de un total de 46 preguntas!
m13r

Respuestas:

39

Puede definir colores en sus secuencias de comandos bash de la siguiente manera:

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'

Y luego úselos para imprimir en los colores requeridos:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."
jasonwryan
fuente
11

Puedes usar tput ORprintf

Utilizando tput,

solo crea la función como se muestra a continuación y úsalas

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)
}

puedes llamar a la función anterior usando shw_err "WARNING:: Error bla bla"

Utilizando printf

print red; echo -e "\e[31mfoo\e[m"
Rahul Patil
fuente
2
echo -eno lo es printf, y también necesita una advertencia de que difiere de la tputopción en que no se adapta automáticamente para adaptarse $TERM.
Toby Speight
7

En zsh :

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
Gilles 'SO- deja de ser malvado'
fuente
También:print -P '%F{red}blah%f'
Stéphane Chazelas
4

Para usos comunes simples (línea de texto completa en un solo color, con nueva línea final) modifiqué el código de jasonwryan de la siguiente manera:

#!/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"
Comodín
fuente
O en Awk, modificado ligeramente:awk -v red="$(printf '\e[1;31m%%s\e[0m\\n')" -v green="$(printf '\e[1;32m%%s\e[0m\\n')" 'BEGIN { printf red, "This text is in red"; printf green, "This text is in green" }'
Comodín
3

Es mejor usar el tputque manejará los caracteres de escape dependiendo de las capacidades de salida / terminal. (Si un terminal no puede interpretar \e[*los códigos de color, entonces será "contaminado" que hace que la salida más difícil de leer. (O, a veces, si grepdicha salida, verá los \e[*en los resultados)

Vea este tutorial paratput .

Puedes escribir :

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

Aquí hay un tutorial para imprimir un reloj de color en la terminal.

Además, tenga en cuenta que tputaún puede imprimir caracteres de escape al redirigir STDOUT a un archivo:

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

Para evitar que esto suceda, configure sus tputvariables como se propone en esta solución .

el-teedee
fuente