Jakich kodów kolorów mogę używać w monicie PS1?

131

Użyłem kilku kolorów w monicie PS1, takich jak

\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

Gdzie mogę znaleźć listę kodów kolorów, których mogę użyć?

Spojrzałem na Colorize Bash Console Color, ale nie odpowiedział na moje pytanie dotyczące listy faktycznych kodów.

Byłoby miło, gdyby istniała również bardziej czytelna forma.

Zobacz także https://unix.stackexchange.com/a/127800/10043

Michael Durrant
źródło
3
Zauważ, że finał \]tutaj nie jest właściwie częścią sekwencji kolorów; służy to konkretnemu ustawianiu monitów (dodałem kilka akapitów na końcu mojej odpowiedzi na ten temat). „Byłoby miło, gdyby istniała również bardziej czytelna forma”. -> Wytnij i wklej we własnej odpowiedzi jest jednym ze sposobów, aby to zrobić.
złotowłosa

Odpowiedzi:

173

Są to sekwencje specjalne ANSI ; ten link prowadzi do tabeli kodów kolorów, ale na tej stronie Wikipedii są też inne ciekawe rzeczy. Nie wszystkie z nich działają na (np.) Normalnej konsoli Linux.

To jest niepoprawne:

\033]00m\] # white

0resetuje terminal do domyślnych (prawdopodobnie białych). Rzeczywisty kod białego pierwszego planu to 37. Ponadto nawias klamrowy zamykający na końcu ( \]) nie jest częścią sekwencji kolorów (zobacz kilka ostatnich akapitów poniżej, aby wyjaśnić ich cel w ustawianiu monitu).

Należy pamiętać, że niektóre terminale GUI pozwalają określić niestandardowy schemat kolorów. Wpłynie to na wynik.

Jest tutaj lista, która dodaje 7 kolorów pierwszego planu i 7 kolorów tła, których wcześniej nie widziałam, ale wydają się działać:

# 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 

Ponadto, jeśli masz 256-kolorowy terminal GUI (myślę, że większość z nich jest teraz), możesz zastosować kolory z tej tabeli:

xterm 256 karta kolorów

Sekwencja ANSI, aby je wybrać, używając liczby w lewym dolnym rogu, rozpoczyna się 38;5;na pierwszym planie i 48;5;na tle, a następnie numer koloru, a więc np .:

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

Daje mi jasnopomarańczowy kolor na jasnobrązowy (co oznacza, że ​​paleta kolorów jest z grubsza przybliżona).

Możesz zobaczyć kolory na tym wykresie 1, ponieważ dość łatwo pojawiałyby się na twoim terminalu:

#!/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  

Wynik jest oczywisty.

Niektóre systemy ustawiają zmienną $ TERM na, xterm-256colorjeśli używasz 256-kolorowego terminala za pomocą jakiegoś kodu powłoki /etc/profile. W innych przypadkach powinieneś mieć możliwość skonfigurowania terminala, aby z niego korzystał. To pozwoli aplikacjom TUI wiedzieć, że jest 256 kolorów i pozwoli ci dodać coś takiego ~/.bashrc:

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

Pamiętaj, że kiedy używasz sekwencji ucieczki kolorów w swoim znaku zachęty, powinieneś umieścić je w \nawiasach kwadratowych (z prefiksem), jak poniżej:

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

Zauważ, że [wnętrze sekwencji kolorów nie jest usuwane, ale otaczające są. Celem tego drugiego jest wskazanie powłoce, że zamknięta sekwencja nie liczy się do długości znaku zachęty. Jeśli ta liczba jest niepoprawna, podczas przewijania historii mogą się zdarzyć dziwne rzeczy, np. Jeśli jest ona zbyt długa, nadmiar długości ostatniego przewijanego ciągu pojawi się na monitach i nie będzie można cofnąć się do to (jest ignorowane w taki sam sposób, jak podpowiedź).

Zauważ też, że jeśli chcesz dołączać dane wyjściowe polecenia uruchamianego za każdym razem, gdy monit jest używany (w przeciwieństwie do tylko jednego razu po ustawieniu pytania), powinieneś ustawić go jako literał ciąg z pojedynczymi cudzysłowami, np .:

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

Chociaż nie jest to świetny przykład, jeśli jesteś zadowolony z używania specjalnych \dlub \D{format}szybkich ucieczek bash - które nie są tematem pytania, ale można je znaleźć man bashpod poniżej PROMPTING. Istnieje wiele innych przydatnych ucieczek, takich jak \wbieżący katalog, \ubieżący użytkownik itp.


1. Główną częścią tego wykresu, kolory 16 - 231 (zauważ, że nie są one uporządkowane numerycznie) to sześcian kolorów 6 x 6 x 6 RGB. „Kolorowa kostka” odnosi się do faktu, że przestrzeń kolorów RGB można przedstawić za pomocą trójwymiarowej tablicy (z jedną osią dla czerwieni, jedną dla zieleni i jedną dla niebieskiego). Każdy kolor w sześcianie tutaj może być reprezentowany jako współrzędne w tablicy 6 x 6 x 6, a indeks na wykresie obliczany w ten sposób:

    16 + R * 36 + G * 6 + B

Pierwszy kolor w sześcianie, o indeksie 16 na wykresie, jest czarny (RGB 0, 0, 0). Możesz użyć tej formuły w skrypcie powłoki:

#!/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"
Złotowłosa
źródło
1
Proponuję oryginalnemu pytającemu przetestować dostępność kolorów za pomocą tabeli testowej. Jest tutaj jeden: robmeerman.co.uk/unix/... lub może być bardzo łatwo to zrobić, jeśli nie ufa się skryptom powłoki znalezionym w Internecie.
IBr
1
@IBr Interesujący punkt. Samo oglądanie wszystkich kolorów to proste zadanie, więc mam kilka linii bash powyżej, aby to zrobić.
złotowłosa
Znajdujący się tutaj skrypt odniesienia kolorów może być bardziej przydatny, ponieważ jest zwarty, ale wciąż ma kody i każdy kolor jest oddzielony dla zachowania przejrzystości.
Michael Plotke
1
Proszę nie używać echodo niczego innego niż dosłowny tekst, który nie zaczyna się od myślnika ( -). Nie można go przenosić. Wszystkie typowe implementacje naruszają standard, który stanowi, że żadna opcja nie powinna być obsługiwana. Gorzej, są niespójne. Zamiast tego powinieneś użyć printf. (I nie osadzaj zmiennych w instrukcjach printf, użyj %s.)
nyuszika7h
2
colortest-256wypisz paletę xterm w ładnej, kompaktowej formie. ( apt-get install colortestjeśli brak)
Volker Siegel
38

Wygląda na to, że przynajmniej niektóre z list to:

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

na podstawie https://wiki.archlinux.org/index.php/Color_Bash_Prompt

Michael Durrant
źródło
2
Dziękujemy za dostarczenie w końcu naprawdę użytecznych ciągów.
lbutlr
21

Napisałem funkcję bash, która może pokazać wszystkie kolory, jeśli to pomoże.

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
}

Możesz to wrzucić do pliku .bashrc / .bash_profile / .bash_aliases lub zapisać jako skrypt i uruchomić w ten sposób. Możesz użyć kolorów, aby zmienić kolor, tak jak ja z moim imieniem poniżej.

Wyjścia colorgrid (): Wyjście colorgrid ()

Zmieniłem swoje nazwisko w moim .bash_profile, wykonując następujące czynności:

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 "

Zauważ, że przedrostek 01 w łańcuchu jak \[\033[01;38;5;214m\]a ustawia pogrubienie.

Plasmarob
źródło
3
Bardzo się cieszę, że to udostępniłem. przydał się dzisiaj, poprawiając ustawienia bashrc i terminala, aby były mniej ohydne. Właśnie widziałem też datę - jutro będzie 2 lata temu.
Plasmarob
12

Kolejny skrypt, taki jak ten opublikowany przez TAFKA „goldilocks” do wyświetlania kolorów, który może być nieco bardziej praktyczny w celach informacyjnych:

#!/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

To powinno mieć odpowiedni rozmiar dla używanego terminala. W tym celu jest nieco przesadzony, ale teraz możesz kontrolować wiele aspektów wyświetlania tego za pomocą parametrów. Mam nadzieję, że wszystkie są oczywiste.

krowe
źródło
1
Nie zabijaj jak przesada :)
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
źródło