Noms de couleur de terminal «conviviaux» dans les scripts shell?

25

Je connais les bibliothèques dans des langages tels que Ruby et Javascript pour faciliter la colorisation de vos scripts de terminal en utilisant des noms de couleur comme "rouge".

Mais y a-t-il quelque chose comme ça pour les scripts shell dans Bash, ou Ksh, ou autre chose?

le miroir
la source
8
veuillez marquer une réponse comme correcte ... vous n'avez marqué que 1 sur votre total de 46 questions posées jusqu'à présent!
m13r

Réponses:

39

Vous pouvez définir des couleurs dans vos scripts bash comme ceci:

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'

Et puis utilisez-les pour imprimer dans vos couleurs souhaitées:

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

Vous pouvez utiliser tput OUprintf

Utilisation tput,

il suffit de créer une fonction comme ci-dessous et de les utiliser

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

vous pouvez appeler la fonction ci-dessus en utilisant shw_err "WARNING:: Error bla bla"

En utilisant printf

print red; echo -e "\e[31mfoo\e[m"
Rahul Patil
la source
2
echo -en'est pas printf, et a également besoin d'un avertissement qu'il diffère de l' tputoption en ce qu'il ne s'adapte pas automatiquement en fonction $TERM.
Toby Speight
7

En zsh :

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
Gilles 'SO- arrête d'être méchant'
la source
Aussi:print -P '%F{red}blah%f'
Stéphane Chazelas
4

Pour les utilisations courantes simples (ligne complète de texte dans une seule couleur uniquement, avec un retour à la ligne), j'ai modifié le code de jasonwryan comme suit:

#!/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"
Caractère générique
la source
Ou dans Awk, légèrement modifié: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" }'
Wildcard
3

Il vaut mieux utiliser tputce qui gérera les caractères d'échappement en fonction des capacités de sortie / terminal. (Si un terminal ne peut pas interpréter \e[*les codes de couleur, il sera "pollué", ce qui rendra la sortie plus difficile à lire. (Ou parfois, si vous avez une greptelle sortie, vous les verrez \e[*dans les résultats)

Voir ce tutoriel pourtput .

Tu peux écrire :

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

Voici un tutoriel pour imprimer une horloge colorée dans le terminal.

Notez également que tputpeut toujours imprimer le caractère d'échappement lors de la redirection de STDOUT vers un fichier:

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

Pour éviter que cela ne se produise, configurez vos tputvariables comme proposé dans cette solution .

el-teedee
la source