In meinem PS1-Prompt habe ich mehrere Farben verwendet, z. B.
\033]01;31\] # pink
\033]00m\] # white
\033]01;36\] # bold green
\033]02;36\] # green
\033]01;34\] # blue
\033]01;33\] # bold yellow
Wo kann ich eine Liste der Farbcodes finden, die ich verwenden kann?
Ich habe auf https://unix.stackexchange.com/questions/74024/colorize-bash-console-color nachgeschaut, aber es hat meine Frage nach einer Liste der tatsächlichen Codes nicht beantwortet.
Es wäre schön, wenn es auch eine besser lesbare Form gäbe.
Dabei handelt es sich um ANSI-Escape-Sequenzen; der Link führt zu einer Tabelle mit Farbcodes, aber auf der Wikipedia-Seite gibt es auch noch andere interessante Informationen. Nicht alle davon funktionieren (z. B.) auf einer normalen Linux-Konsole.
Dies ist nicht korrekt:
033]00m\] # white
0" setzt das Terminal auf seine Standardeinstellung zurück (die wahrscheinlich weiß ist). Der eigentliche Code für weißen Vordergrund ist 37. Auch die geschützte schließende Klammer am Ende (\]
) ist nicht Teil der Farbsequenz (siehe die letzten Absätze weiter unten für eine Erklärung ihres Zwecks beim Einstellen einer Eingabeaufforderung).
Beachten Sie, dass Sie bei einigen GUI-Terminals ein eigenes Farbschema angeben können. Dies hat Auswirkungen auf die Ausgabe.
Es gibt eine Liste hier, die 7 Vordergrund- und 7 Hintergrundfarben hinzufügt, die ich vorher noch nicht gesehen hatte, aber sie scheinen zu funktionieren:
# Foreground colors
90 Dark gray
91 Light red
92 Light green
93 Light yellow
94 Light blue
95 Light magenta
96 Light cyan
# Background colors
100 Dark gray
101 Light red
102 Light green
103 Light yellow
104 Light blue
105 Light magenta
106 Light cyan
Wenn Sie ein 256-Farben-GUI-Terminal haben (ich glaube, die meisten haben das jetzt), können Sie außerdem Farben aus dieser Tabelle verwenden:
Die ANSI-Sequenz, um diese auszuwählen, beginnt mit der Nummer in der unteren linken Ecke, 38;5;
für den Vordergrund und 48;5;
für den Hintergrund, dann die Farbnummer, also z.B.:
echo -e "\\033[48;5;95;38;5;214mhello world\\033[0m"
Ergibt ein helles Orange auf Tan (d.h. die Farbtabelle ist grob approximiert).
Sie können die Farben in diesem Diagramm1 sehen, wie sie auf Ihrem Terminal ziemlich leicht erscheinen würden:
#!/bin/bash
color=16;
while [ $color -lt 245 ]; do
echo -e "$color: \\033[38;5;${color}mhello\\033[48;5;${color}mworld\\033[0m"
((color++));
done
Die Ausgabe ist selbsterklärend.
Einige Systeme setzen die $TERM-Variable auf xterm-256color
, wenn Sie ein 256-Farben-Terminal benutzen, und zwar über einen Shell-Code in /etc/profile
. Auf anderen Systemen sollten Sie in der Lage sein, Ihr Terminal so zu konfigurieren, dass es dies verwendet. Das lässt TUI-Anwendungen wissen, dass es 256 Farben gibt, und erlaubt es Ihnen, etwas wie dies zu Ihrer ~/.bashrc
hinzuzufügen:
if [[ "$TERM" =~ 256color ]]; then
PS1="MyCrazyPrompt..."
fi
Wenn Sie Farb-Escape-Sequenzen in Ihrer Eingabeaufforderung verwenden, sollten Sie sie in eckige Klammern einschließen, etwa so:
PS1="\[\033[01;32m\]MyPrompt: \[\033[0m\]"
Beachten Sie, dass die [
's innerhalb der Farbsequenz nicht mit Escapezeichen versehen sind, aber die umschließenden Klammern schon. Der Zweck der letzteren ist es, der Shell zu zeigen, dass die eingeschlossene Sequenz nicht zur Zeichenlänge der Eingabeaufforderung zählt. Wenn diese Zählung falsch ist, passieren seltsame Dinge, wenn Sie durch die Historie zurückblättern, z.B. wenn sie zu lang ist, wird die überschüssige Länge der letzten gescrollten Zeichenkette an Ihre Eingabeaufforderung angehängt und Sie können nicht mit der Rücktaste dorthin zurückgehen (sie wird genauso ignoriert wie die Eingabeaufforderung).
Beachten Sie auch, dass Sie die Ausgabe eines Befehls, der jedes Mal ausgeführt wird, wenn die Eingabeaufforderung verwendet wird (und nicht nur einmal, wenn die Eingabeaufforderung gesetzt wird), als literale Zeichenkette mit einfachen Anführungszeichen setzen sollten, z.B.:
PS1='\[\033[01;32m\]$(date): \[\033[0m\]'
Obwohl dies kein gutes Beispiel ist, wenn Sie mit den speziellen \d
oder \D{format}
Prompt-Escapes der Bash zufrieden sind -- die nicht das Thema der Frage sind, aber in man bash
unter PROMPTING
gefunden werden können. Es gibt verschiedene andere nützliche Escapes wie \w
für das aktuelle Verzeichnis, \u
für den aktuellen Benutzer, usw.
Der Hauptteil dieses Diagramms, die Farben 16 - 231 (beachten Sie, dass sie nicht in numerischer Reihenfolge sind), sind ein 6 x 6 x 6 RGB-Farbwürfel. "Farbwürfel" bezieht sich auf die Tatsache, dass ein RGB-Farbraum durch ein dreidimensionales Feld dargestellt werden kann (mit einer Achse für Rot, einer für Grün und einer für Blau). Jede Farbe im Würfel kann hier als Koordinaten in einem 6 x 6 x 6-Array dargestellt werden, und der Index in der Tabelle wird folgendermaßen berechnet:
16 + R * 36 + G * 6 + B
Die erste Farbe im Würfel, bei Index 16 im Diagramm, ist schwarz (RGB 0, 0, 0). Sie könnten diese Formel in einem Shell-Skript verwenden:
#!/bin/sh
function RGBcolor {
echo "16 + $1 * 36 + $2 * 6 + $3" | bc
}
fg=$(RGBcolor 1 0 2) # Violet
bg=$(RGBcolor 5 3 0) # Bright orange.
echo -e "\\033[1;38;5;$fg;48;5;${bg}mviolet on tangerine\\033[0m"
Sieht so aus, als ob zumindest ein Teil der Liste so ist:
txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m' # Black - Background
bakred='\e[41m' # Red
bakgrn='\e[42m' # Green
bakylw='\e[43m' # Yellow
bakblu='\e[44m' # Blue
bakpur='\e[45m' # Purple
bakcyn='\e[46m' # Cyan
bakwht='\e[47m' # White
txtrst='\e[0m' # Text Reset
basierend auf https://wiki.archlinux.org/index.php/Color_Bash_Prompt
Ein anderes Skript wie das von TAFKA gepostete 'goldilocks' für die Anzeige von Farben, das für Referenzzwecke vielleicht ein wenig praktischer ist:
#!/bin/bash
useage() {
printf "\n\e[1;4mAscii Escape Code Helper Utility\e[m\n\n"
printf " \e[1mUseage:\e[m colors.sh [-|-b|-f|-bq|-fq|-?|?] [start] [end] [step]\n\n"
printf "The values for the first parameter may be one of the following:\n\n"
printf " \e[1m-\e[m Will result in the default output.\n"
printf " \e[1m-b\e[m This will display the 8 color version of this chart.\n"
printf " \e[1m-f\e[m This will display the 256 color version of this chart using foreground colors.\n"
printf " \e[1m-q\e[m This will display the 256 color version of this chart without the extra text.\n"
printf " \e[1m-bq\e[m This will display the 8 color version of this chart without the extra text.\n"
printf " \e[1m-fq\e[m This will display the 256 color version of this chart using foreground colors without the extra text.\n"
printf " \e[1m-?|?\e[m Displays this help screen.\n"
printf "\nThe remaining parameters are only used if the first parameter is one of: \e[1m-,-f,q,fq\e[m\n\n"
printf " \e[1mstart\e[m The color index to begin display at.\n"
printf " \e[1mend\e[m The color index to stop display at.\n"
printf " \e[1mstart\e[m The number of indexes to increment color by each iteration.\n\n\n"
}
verbose() {
if [[ "$1" != "-q" && "$1" != "-fq" && "$1" != "-bq" ]]; then
printf "\nTo control the display style use \e[1m%s\e[m where \e[1m%s\e[m is:\n" '\e[{$value}[:{$value}]m' '{$value}'
printf "\n 0 Normal \e[1m1 Bold\e[m \e[2m2 Dim\e[m \e[3m3 ???\e[m \e[4m4 Underlined\e[m \e[5m5 Blink\e[m \e[6m6 ???\e[m \e[7m7 Inverted\e[m \e[8m8 Hidden\e[m\n\n"
printf "If \e[1m%s\e[m is not provided it will reset the display.\n\n" '{$value}'
fi
}
eight_color() {
local fgc bgc vals seq0
if [ "$1" != "-bq" ]; then
printf "\n\e[1;4m8 Color Escape Value Pallette\e[m\n\n"
printf "Color escapes are \e[1m%s\e[m\n" '\e[${value};...;${value}m'
printf " Values \e[1m30..37\e[m are \e[1mforeground\e[m colors\n"
printf " Values \e[1m40..47\e[m are \e[1mbackground\e[m colors\n\n"
fi
for fgc in {30..37}; do
for bgc in {40..47}; do
fgc=${fgc#37}
bgc=${bgc#40}
vals="${fgc:+$fgc;}${bgc}"
vals=${vals%%;}
seq0="${vals:+\e[${vals}m}"
printf " %-9s" "${seq0:-(default)}"
printf " ${seq0}TEXT\e[m"
printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m"
done
printf "\e[0m\n"
done
}
if [[ "$1" == "-b" || "$1" == "-bq" ]]; then
eight_color "$1"
verbose "$1"
elif [[ "$1" == "" || "$1" == "-" || "$1" == "-f" || "$1" == "-q" || "$1" == "-fq" ]]; then
start=${2:-0}
end=${3:-255}
step=${4:-1}
color=$start
style="48;5;"
if [[ "$1" == "-f" || "$1" == "-fq" ]]; then
style="38;5;"
fi
perLine=$(( ( $(tput cols) - 2 ) / 9 ));
if [[ "$1" != "-q" && "$1" != "-fq" ]]; then
printf "\n\e[1;4m256 Color Escape Value Pallette\e[0m\n\n"
printf " \e[1m%s\e[m for \e[1mbackground\e[m colors\n \e[1m%s\e[m for \e[1mforeground\e[m colors\n\n" '\e[48;5;${value}m' '\e[38;5;${value}m'
fi
while [ $color -le $end ]; do
printf "\e[m \e[${style}${color}m %3d \e[m " $color
((color+=step))
if [ $(( ( ( $color - $start ) / $step ) % $perLine )) -eq 0 ]; then
printf "\n"
fi
done
printf "\e[m\n"
verbose "$1"
else
useage
fi
Dies sollte die richtige Größe für das von Ihnen verwendete Terminal haben. Für diesen Zweck ist es ein wenig übertrieben, aber Sie können nun viele Aspekte der Anzeige über Parameter steuern. Hoffentlich sind sie alle selbsterklärend.