"Freundliche" Terminalfarbnamen in Shell-Skripten?

25

Ich kenne Bibliotheken in Sprachen wie Ruby und Javascript, um das Einfärben von Terminalskripten durch die Verwendung von Farbnamen wie "rot" zu vereinfachen.

Aber gibt es so etwas für Shell-Skripte in Bash oder Ksh oder was auch immer?

der Spiegel
quelle
8
Bitte markieren Sie eine Antwort als richtig ... Sie haben bisher nur 1 von insgesamt 46 gestellten Fragen markiert!
m13r

Antworten:

39

Sie können Farben in Ihren Bash-Skripten wie folgt definieren:

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'

Und verwenden Sie sie dann, um in den gewünschten Farben zu drucken:

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

Sie können tput ODER verwendenprintf

Verwenden tput,

erstelle einfach eine funktion wie unten und benutze sie

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

Sie können die obige Funktion mit aufrufen shw_err "WARNING:: Error bla bla"

Verwenden printf

print red; echo -e "\e[31mfoo\e[m"
Rahul Patil
quelle
2
echo -eist nicht printfund benötigt auch eine Warnung, dass es sich von der tputOption dadurch unterscheidet, dass es sich nicht automatisch an den Anzug anpasst $TERM.
Toby Speight
7

In zsh :

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
Gilles 'SO - hör auf böse zu sein'
quelle
Außerdem:print -P '%F{red}blah%f'
Stéphane Chazelas
4

Für einfache, häufige Verwendungen (vollständige Textzeile nur in einer Farbe, mit nachgestelltem Zeilenumbruch) habe ich den Code von jasonwryan wie folgt geändert :

#!/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"
Platzhalter
quelle
Oder in Awk, leicht modifiziert: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

Besser ist die Verwendung von tputEscape-Zeichen in Abhängigkeit von den Ausgabe- / Terminalfunktionen. (Wenn ein Terminal keine \e[*Farbcodes interpretieren kann, ist die Ausgabe "verschmutzt", was das Lesen erschwert. Wenn Sie eine grepsolche Ausgabe durchführen, werden diese manchmal \e[*in den Ergebnissen angezeigt.)

Siehe dieses Tutorial fürtput .

Du kannst schreiben :

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

Hier ist ein Tutorial zum Drucken einer farbigen Uhr im Terminal.

Beachten Sie außerdem, dass tputbeim Umleiten von STDOUT in eine Datei möglicherweise noch Escapezeichen ausgegeben werden:

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

Um dies zu verhindern, richten Sie Ihre tputVariablen wie in dieser Lösung vorgeschlagen ein .

el-teedee
quelle