Welche Farbcodes kann ich in meiner PS1-Eingabeaufforderung verwenden?

132

Ich habe in meiner PS1-Eingabeaufforderung mehrere Farben verwendet, z

\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 finde ich eine Liste der Farbcodes, die ich verwenden kann?

Ich habe mir Colorize Bash Console Color angesehen, aber meine Frage nach einer Liste der tatsächlichen Codes wurde nicht beantwortet.

Es wäre schön, wenn es auch eine besser lesbare Form gäbe.

Siehe auch https://unix.stackexchange.com/a/127800/10043

Michael Durrant
quelle
3
Beachten Sie, dass das Finale \]hier tatsächlich nicht Teil der Farbsequenz ist. Es dient einem bestimmten Zweck, Eingabeaufforderungen festzulegen (dazu habe ich am Ende meiner Antwort einige Absätze hinzugefügt). "Es wäre schön, wenn es auch eine besser lesbare Form gäbe." -> das Ausschneiden und Einfügen in Ihrer eigenen Antwort ist eine Möglichkeit, dies zu tun.
Goldlöckchen

Antworten:

174

Dies sind ANSI-Escape-Sequenzen . Dieser Link führt zu einer Tabelle mit Farbcodes, aber es gibt auch andere interessante Dinge auf dieser Wikipedia-Seite. Nicht alle funktionieren (zB) auf einer normalen Linux-Konsole.

Das ist falsch:

\033]00m\] # white

0Setzt das Terminal auf seine Standardeinstellung zurück (die wahrscheinlich weiß ist). Der tatsächliche Code für den weißen Vordergrund ist 37. Außerdem ist die maskierte schließende Klammer am Ende ( \]) nicht Teil der Farbsequenz (in den letzten Absätzen unten finden Sie Erläuterungen zu ihrem Zweck beim Festlegen einer Eingabeaufforderung).

Beachten Sie, dass Sie bei einigen GUI-Terminals ein benutzerdefiniertes Farbschema festlegen können. Dies wirkt sich auf die Ausgabe aus.

Es gibt hier eine Liste mit 7 Vordergrund- und 7 Hintergrundfarben, die ich noch nicht gesehen habe, 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 denke, die meisten von ihnen sind jetzt), können Sie Farben aus dieser Tabelle anwenden:

xterm 256 Farbkarte

Die ANSI-Sequenz, in der diese ausgewählt werden, beginnt mit der Nummer in der unteren linken Ecke 38;5;für den Vordergrund und 48;5;für den Hintergrund, dann für die Farbnummer. Beispiel:

echo -e "\\033[48;5;95;38;5;214mhello world\\033[0m"

Gibt mir ein hellorange auf tan (das heißt, die Farbkarte ist grob angenähert).

Sie können die Farben in dieser Tabelle 1 so sehen, wie sie auf Ihrem Terminal 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 Variable $ TERM auf, xterm-256colorwenn Sie sich über einen Shell-Code in einem 256-Farben-Terminal befinden /etc/profile. Bei anderen sollte es Ihnen möglich sein, Ihr Terminal für diese Verwendung zu konfigurieren. Dadurch erfahren TUI-Anwendungen, dass 256 Farben vorhanden sind, und Sie können Folgendes hinzufügen ~/.bashrc:

if [[ "$TERM" =~ 256color ]]; then
     PS1="MyCrazyPrompt..."
fi

Beachten Sie, dass Sie beim Verwenden von Farb-Escape-Sequenzen in der Eingabeaufforderung diese in \eckigen Klammern mit Escape-Zeichen ( vorangestellt) einschließen sollten :

PS1="\[\033[01;32m\]MyPrompt: \[\033[0m\]"

Beachten Sie, dass das [Innere der Farbsequenz nicht maskiert wird, die umschließenden jedoch. Der Zweck des letzteren ist es, der Shell anzuzeigen, dass die eingeschlossene Sequenz nicht zur Zeichenlänge der Eingabeaufforderung zählt. Wenn diese Anzahl falsch ist, passieren seltsame Dinge, wenn Sie durch den Verlauf zurückscrollen, z. B. wenn sie zu lang ist, wird die überschüssige Länge der zuletzt gescrollten Zeichenfolge an Ihre Eingabeaufforderung angehängt und Sie können keine Rücktaste drücken es (es wird genauso ignoriert wie die Eingabeaufforderung).

Beachten Sie auch, dass Sie die Ausgabe eines Befehls, der bei jeder Verwendung der Eingabeaufforderung ausgeführt werden soll (anstatt nur einmal, wenn die Eingabeaufforderung festgelegt wird), als Literalzeichenfolge mit einfachen Anführungszeichen festlegen sollten, z.

PS1='\[\033[01;32m\]$(date): \[\033[0m\]'

Dies ist zwar kein gutes Beispiel, wenn Sie mit der Verwendung von speziellen \doder \D{format}sofortigen Escape- Anweisungen von bash zufrieden sind. Diese sind nicht Gegenstand der Frage, finden Sie jedoch man bashunter PROMPTING. Es gibt verschiedene andere nützliche Fluchten, wie zum Beispiel \wfür das aktuelle Verzeichnis, \ufür den aktuellen Benutzer usw.


1. Der Hauptteil dieser Tabelle, Farben 16 - 231 (beachten Sie, dass sie nicht in numerischer Reihenfolge vorliegen), ist ein RGB-Farbwürfel mit den Abmessungen 6 x 6 x 6. "Farbwürfel" bezieht sich auf die Tatsache, dass ein RGB-Farbraum unter Verwendung eines dreidimensionalen Arrays 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 und der Index im Diagramm folgendermaßen berechnet werden:

    16 + R * 36 + G * 6 + B

Die erste Farbe im Würfel am Index 16 im Diagramm ist schwarz (RGB 0, 0, 0). Sie können diese Formel im 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"
Goldlöckchen
quelle
1
Ich empfehle dem ursprünglichen Fragesteller, die Farbverfügbarkeit mit einem Testchart zu testen. Es gibt eine hier: robmeerman.co.uk/unix/… oder es kann sehr einfach sein, eine zu erstellen, wenn man den im Internet gefundenen Shell-Skripten nicht vertraut.
12.
1
@IBr Interessanter Punkt. Alle Farben zu betrachten ist eine ganz einfache Aufgabe, deshalb habe ich ein paar Zeilen Bash oben, um dies zu tun.
Goldlöckchen
Das hier zu findende Farbreferenzskript ist möglicherweise nützlicher, da es kompakt ist und dennoch die Codes enthält und jede Farbe aus Gründen der Klarheit getrennt ist.
Michael Plotke
1
Bitte verwenden Sie echonichts anderes als wörtlichen Text, der nicht mit einem Bindestrich ( -) beginnt . Es ist nicht tragbar. Alle gängigen Implementierungen verstoßen gegen den Standard, der besagt, dass keine Optionen unterstützt werden sollen. Schlimmer noch, sie sind inkonsistent. Sie sollten printfstattdessen verwenden. (Und nicht einbetten Variablen innerhalb printf Aussagen, Verwendung %s.)
nyuszika7h
2
colortest-256Listen Sie die xterm-Palette in einer schönen kompakten Form auf. ( apt-get install colortestfalls nicht vorhanden)
Volker Siegel
38

Zumindest ein Teil der Liste sieht so aus:

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

Michael Durrant
quelle
2
Vielen Dank, dass Sie endlich tatsächlich verwendbare Zeichenfolgen zur Verfügung gestellt haben.
lbutlr
21

Ich habe eine Bash-Funktion geschrieben, mit der Sie alle Farben anzeigen können, wenn dies hilft.

function colorgrid( )
{
    iter=16
    while [ $iter -lt 52 ]
    do
        second=$[$iter+36]
        third=$[$second+36]
        four=$[$third+36]
        five=$[$four+36]
        six=$[$five+36]
        seven=$[$six+36]
        if [ $seven -gt 250 ];then seven=$[$seven-251]; fi

        echo -en "\033[38;5;$(echo $iter)m█ "
        printf "%03d" $iter
        echo -en "   \033[38;5;$(echo $second)m█ "
        printf "%03d" $second
        echo -en "   \033[38;5;$(echo $third)m█ "
        printf "%03d" $third
        echo -en "   \033[38;5;$(echo $four)m█ "
        printf "%03d" $four
        echo -en "   \033[38;5;$(echo $five)m█ "
        printf "%03d" $five
        echo -en "   \033[38;5;$(echo $six)m█ "
        printf "%03d" $six
        echo -en "   \033[38;5;$(echo $seven)m█ "
        printf "%03d" $seven

        iter=$[$iter+1]
        printf '\r\n'
    done
}

Sie können das in ein .bashrc / .bash_profile / .bash_aliases werfen oder es als Skript speichern und auf diese Weise ausführen. Sie können die Farben verwenden, um die Farbe zu ändern, wie ich es mit meinem Namen getan habe.

colorgrid () gibt aus: Ausgabe von colorgrid ()

Ich habe meinen Namen in meinem .bash_profile folgendermaßen geändert:

if [ "$USER" = "plasmarob" ]; then
    p="\[\033[01;38;5;52m\]p"
    l="\[\033[01;38;5;124m\]l"
    a="\[\033[01;38;5;196m\]a"
    s="\[\033[01;38;5;202m\]s"
    m="\[\033[01;38;5;208m\]m"
    a2="\[\033[01;38;5;214m\]a"
    r="\[\033[01;38;5;220m\]r"
    o="\[\033[01;38;5;226m\]o"
    b="\[\033[01;38;5;228m\]b"
    local __user_and_host="$p$l$a$s$m$a2$r$o$b"
else
    local __user_and_host="\[\033[01;36m\]\u"
fi   

...

export PS1="$__user_and_host $__cur_location $__git_branch_color$__git_branch$__prompt_tail$__last_color "

Beachten Sie, dass das Präfix 01 in einer Zeichenfolge wie \[\033[01;38;5;214m\]a fett gesetzt ist.

Plasmarob
quelle
3
Ich bin wirklich froh, dass ich das geteilt habe. Es hat sich heute als nützlich erwiesen, ein Bashrc- und Terminal-Setup zu reparieren, um weniger abscheulich zu sein. Habe auch das Datum gesehen - morgen sind es 2 Jahre her.
Plasmarob
12

Ein weiteres Skript wie das von TAFKA veröffentlichte 'goldilocks' zum Anzeigen von Farben, das zu Referenzzwecken vielleicht etwas 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 für das von Ihnen verwendete Terminal die richtige Größe haben. Zu diesem Zweck ist es etwas übertrieben, aber jetzt können Sie viele Aspekte der Anzeige über Parameter steuern. Hoffentlich sind sie alle selbsterklärend.

krowe
quelle
1
Kein Kill wie Overkill :)
Navin
-1
export PS1=\n\[\e[32;1m\](\[\e[37;1m\]\u\[\e[32;1m\])-(\[\e[37;1m\]jobs:\j\[\e[32;1m\])-(\[\e[37;1m\]\w\[\e[32;1m\])\n$ \[\e[0m\]
Ashish Rana
quelle