PS1 istemimde hangi renk kodlarını kullanabilirim?


132

PS1 istemimde birkaç renk kullandım.

\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

Kullanabileceğim renk kodlarının listesini nerede bulabilirim?

Colorize Bash Console Color'a baktım ancak gerçek kodların bir listesiyle ilgili sorumu cevaplamadı.

Ayrıca daha okunaklı bir form olsaydı iyi olurdu.

Ayrıca bakınız https://unix.stackexchange.com/a/127800/10043


3
\]Buradaki finalin renk dizisinin bir parçası olmadığını unutmayın ; özel olarak bilgi istemlerinin belirlenmesinde bir amaca hizmet eder (bu konudaki cevabımın sonuna birkaç paragraf ekledim). "Ayrıca daha okunaklı bir form olsaydı iyi olurdu." -> kendi cevabınla kesme ve yapıştırma bunu yapmanın bir yoludur.
goldilocks

Yanıtlar:


174

Bunlar ANSI kaçış dizileridir ; Bu bağlantı renk kodlarının bir çizelgesine yöneliktir ancak Wikipedia sayfasında da başka ilginç şeyler var. Hepsi normal bir Linux konsolu üzerinde çalışmıyor (örneğin).

Bu yanlış:

\033]00m\] # white

0terminali varsayılan ayarına sıfırlar (muhtemelen beyazdır). Beyaz ön plan için gerçek kod 37'dir. Ayrıca, ( \]) ucundaki kaçış kapanış parantezi renk sırasının bir parçası değildir (istemi belirleme amaçlarının açıklanması için aşağıdaki son birkaç paragrafa bakın).

Bazı GUI terminallerinin özelleştirilmiş bir renk düzeni belirlemenize izin verdiğini unutmayın. Bu çıktıyı etkileyecektir.

Burada daha önce görmediğim 7 ön plan ve 7 arka plan rengi ekleyen bir liste var , ancak çalışıyor gibi görünüyorlar:

# 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 

Ayrıca, 256 renkli bir GUI terminaliniz varsa (çoğunun şimdi olduğunu düşünüyorum), renkleri bu tablodan uygulayabilirsiniz:

xterm 256 renk şeması

Bunları seçmek için ANSI dizisi, sol alt köşedeki sayıyı kullanarak, 38;5;ön plan ve 48;5;arka plan için başlar , ardından renk numarası, örneğin:

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

Bana bronzlukta açık bir turuncu renk verir (yani, renk tablosunda aşağı yukarı yaklaşılır).

Bu tabloda renkleri görebilirsiniz 1 onlar oldukça kolay bir şekilde terminale göründüğü şekilde:

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

Çıktı kendi kendini açıklayıcıdır.

Bazı sistemler, xterm-256coloriçinde bazı kabuk kodları olan 256 renkli bir terminalde iseniz $ TERM değişkenini ayarlar /etc/profile. Diğerlerinde, terminalinizi bunu kullanacak şekilde yapılandırabilmelisiniz. Bu, TUI uygulamalarının 256 renk olduğunu bilmesini ve size şöyle bir şey eklemenizi sağlar ~/.bashrc:

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

Komut isteminizde renk kaçış dizileri kullandığınızda, bunları aşağıdaki gibi kaçık (önceden \eklenmiş) köşeli parantez içine almanız gerektiğini unutmayın :

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

Uyarı [renk dizisine 'ın iç kurtuldu, ama çevreleyen olanlar değildir. İkincisinin amacı, kabuğa ekteki dizinin istemin karakter uzunluğuna saymadığını göstermektir. Bu sayı yanlışsa, geçmişe geri döndüğünüzde garip şeyler olur, örneğin, eğer çok uzunsa, son kaydırılan dizginin aşırı uzunluğu komut isteminize eklenmiş olarak görünür ve geri dönemezsiniz o (istemde olduğu gibi göz ardı edilir).

Ayrıca, komut isteminin her çalıştırılışında bir komutun çıktısını dahil etmek istiyorsanız (komut istemi ayarlandığında sadece bir kere olduğu gibi), onu tek tırnaklı bir hazır bilgi dizesi olarak ayarlamanız gerekir.

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

Bu harika bir örnek olmasa da, bash'ın özel \dveya \D{format}hızlı kaçışlarını kullanmaktan memnunsanız - bu konunun konusu değil ama man bashaltında bulunabilir PROMPTING. \wGeçerli dizin, \ugeçerli kullanıcı, vb. Gibi başka yararlı kaçışlar vardır .


1. Bu çizelgenin ana kısmı, 16 - 231 renkleri (sayısal sırada olmadıklarına dikkat edin), 6 x 6 x 6 RGB renk küpüdür. "Renkli küp", bir RGB renk uzayının üç boyutlu bir dizi (kırmızı için bir eksen, yeşil için bir ve mavi için bir tane) kullanılarak gösterilebileceği gerçeğini ifade eder. Buradaki küpteki her renk 6 x 6 x 6 dizisinde koordinat olarak temsil edilebilir ve grafikteki dizin bu şekilde hesaplanır:

    16 + R * 36 + G * 6 + B

Küpteki ilk renk, grafikteki 16. indekste siyahtır (RGB 0, 0, 0). Bu formülü kabuk betiğinde kullanabilirsiniz:

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

1
Orijinal askerin renk elverişliliğini bir test çizelgesiyle test etmesini öneririm. Burada bir tane var: robmeerman.co.uk/unix/… veya biri internette bulunan kabuk komut dosyalarına güvenmiyorsa, bir tane yapmak çok kolay olabilir.
IBr

1
@ IBr İlginç nokta. Sadece tüm renkleri görüntülemek, basit ve basit bir iştir;
goldilocks

Burada bulunan renk referans komut dosyası daha kullanışlı olabilir, kompakt olmasına rağmen hala kodları vardır ve her bir renk netlik için ayrılmıştır.
Michael Plotke

1
Lütfen, echokısa bir çizgi ( -) ile başlamayan gerçek metinlerden başka bir şey için kullanmayın . Bu taşınabilir değil. Tüm yaygın uygulamalar , hiçbir seçeneğin desteklenmemesi gerektiğini belirten standardı ihlal eder . Daha kötüsü, tutarsızlar. Bunun printfyerine kullanmalısın . (Ve yok , printf ifadeleri içeride kullanımını değişkenleri gömmek %s.)
nyuszika7h

2
colortest-256xterm paletini hoş ve kompakt bir formda listeler. ( apt-get install colortesteğer eksikse)
Volker Siegel

38

Görünüşe göre listedeki en azından bazıları:

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

https://wiki.archlinux.org/index.php/Color_Bash_Prompt dayalı


2
Sonunda gerçekten kullanılabilir karakter dizileri verdiğiniz için teşekkür ederiz.
lbutlr,

21

Bu yardımcı olursa, size tüm renkleri gösterebilecek bir bash işlevi yazdım.

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
}

Bunu bir .bashrc / .bash_profile / .bash_aliases içine atabilir veya bir komut dosyası olarak kaydedebilir ve bu şekilde çalıştırabilirsiniz. Renkleri, adımı aşağıdaki gibi yaptığım gibi değiştirmek için kullanabilirsiniz.

colorgrid () çıktıları: Colorgrid () çıkışı

Bunu yaparak .bash_profile ismimi değiştirdim:

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 "

Bir dize içindeki 01 ön ekinin \[\033[01;38;5;214m\]a kalın olarak ayarlandığını unutmayın.


3
Bunu paylaştığım için çok mutluyum. Bugün daha az iğrenç olmak için bir bashrc ve terminal kurulumunu düzeltmek kullanışlı oldu. Sadece tarihi de gördüm - yarın 2 yıl önce olacak.
Plasmarob

12

TAFKA tarafından yayınlanan ve 'referanslar için biraz daha pratik olan' renkleri göstermek için 'goldilocks' tarafından yayınlanan bir yazı.

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

Bu, kullandığınız terminal için doğru boyutlandırılmalıdır. Bu amaç için biraz üstte ama şimdi bunun parametrelerle nasıl görüntülendiğinin birçok yönünü kontrol edebilirsiniz. Umarım, hepsi açıklayıcıdır.


1
Overkill gibi öldürmek yok :)
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\]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.