ttata renk tablosu Renk kodları nasıl belirlenir?


79

Terminallerimin renklendirilmesi sürecindeyim PS1.

Renk değişkenlerini kullanarak ayarlıyorum tput; örneğin, işte mor:

PURPLE=$(tput setaf 125)

Soru:

125Diğer renklerin renk kodlarını (örn. ) Nasıl bulabilirim ?

Bir yerlerde renkli bir masa rehberi / kopya kağıdı var mı?

Ne olduğundan emin değilim 125… Onaltılık bir renk alıp setafkullanabilecek bir sayıya dönüştürmenin bir yolu var mı ?


Yanıtlar:


153

Tput için mevcut renklerin sayısı tarafından verilir tput colors.

Temel 8 rengi görmek için ( setfurxvt terminalinde ve setafxterm terminalinde kullanıldığı gibi):

$ printf '\e[%sm▒' {30..37} 0; echo           ### foreground
$ printf '\e[%sm ' {40..47} 0; echo           ### background

Ve genellikle şöyle adlandırılır:

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
magenta   COLOR_MAGENTA     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

Genişletilmiş 256 rengi görmek için ( setafurxvt tarafından kullanıldığı gibi ):

$ printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'

Rakamlar ve sipariş edilen bir çıktı istiyorsanız:

#!/bin/bash
color(){
    for c; do
        printf '\e[48;5;%dm%03d' $c $c
    done
    printf '\e[0m \n'
}

IFS=$' \t\n'
color {0..15}
for ((i=0;i<6;i++)); do
    color $(seq $((i*36+16)) $((i*36+51)))
done
color {232..255}

Dizinleriyle etiketlenmiş sıralı 256 renk şeması


16 milyon rengin oldukça fazla koda ihtiyacı var (bazı konsollar bunu gösteremez).
Temel bilgiler:

fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"

fbolduğu front/backveya 3/4.

Konsol kapasitenizin bu kadar çok renk sunması için yapılan basit bir test:

for r in {200..255..5}; do fb=4;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm   ' "$fb" "$r" "$g" "$b"; done; echo

kırmızı çizgiden, koyudan hafif olana doğru solma (soldan sağa) Soldan sağa tonda çok küçük bir değişiklik ile kırmızı bir çizgi sunacak. Bu küçük değişiklik görülebilirse, konsolunuz 16 milyon renk kapasitesine sahiptir.

Her r, gve bRGB için 0 ile 255 arasında bir değerdir (Kırmızı, Yeşil, Mavi).

Konsol tipiniz bunu destekliyorsa, bu kod renkli bir tablo oluşturur:

mode2header(){
    #### For 16 Million colors use \e[0;38;2;R;G;Bm each RGB is {0..255}
    printf '\e[mR\n' # reset the colors.
    printf '\n\e[m%59s\n' "Some samples of colors for r;g;b. Each one may be 000..255"
    printf '\e[m%59s\n'   "for the ansi option: \e[0;38;2;r;g;bm or \e[0;48;2;r;g;bm :"
}
mode2colors(){
    # foreground or background (only 3 or 4 are accepted)
    local fb="$1"
    [[ $fb != 3 ]] && fb=4
    local samples=(0 63 127 191 255)
    for         r in "${samples[@]}"; do
        for     g in "${samples[@]}"; do
            for b in "${samples[@]}"; do
                printf '\e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
            done; printf '\e[m\n'
        done; printf '\e[m'
    done; printf '\e[mReset\n'
}
mode2header
mode2colors 3
mode2colors 4

etiket olarak dizinleri ile örnek ön plan renklerinin tablosu

etiket olarak dizinleri ile örnek arka plan renklerinin tablosu

Onaltılı renk değerini (en yakın) 0-255 renk dizinine dönüştürmek için:

fromhex(){
    hex=${1#"#"}
    r=$(printf '0x%0.2s' "$hex")
    g=$(printf '0x%0.2s' ${hex#??})
    b=$(printf '0x%0.2s' ${hex#????})
    printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 + 
                       (g<75?0:(g-35)/40)*6   +
                       (b<75?0:(b-35)/40)     + 16 ))"
}

Olarak kullan:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

Renk sayısını HTML renk biçiminde bulmak için :

#!/bin/dash
tohex(){
    dec=$(($1%256))   ### input must be a number in range 0-255.
    if [ "$dec" -lt "16" ]; then
        bas=$(( dec%16 ))
        mul=128
        [ "$bas" -eq "7" ] && mul=192
        [ "$bas" -eq "8" ] && bas=7
        [ "$bas" -gt "8" ] && mul=255
        a="$((  (bas&1)    *mul ))"
        b="$(( ((bas&2)>>1)*mul ))" 
        c="$(( ((bas&4)>>2)*mul ))"
        printf 'dec= %3s basic= #%02x%02x%02x\n' "$dec" "$a" "$b" "$c"
    elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; then
        b=$(( (dec-16)%6  )); b=$(( b==0?0: b*40 + 55 ))
        g=$(( (dec-16)/6%6)); g=$(( g==0?0: g*40 + 55 ))
        r=$(( (dec-16)/36 )); r=$(( r==0?0: r*40 + 55 ))
        printf 'dec= %3s color= #%02x%02x%02x\n' "$dec" "$r" "$g" "$b"
    else
        gray=$(( (dec-232)*10+8 ))
        printf 'dec= %3s  gray= #%02x%02x%02x\n' "$dec" "$gray" "$gray" "$gray"
    fi
}

for i in $(seq 0 255); do
    tohex ${i}
done

("Temel" ilk 16 renk, "renk" ana grup, "gri" son gri renk) olarak kullanın:

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626

Fromhex işleviniz harika! Çok teşekkürler!
mhulse

Sevmek fromhex. Tekrar teşekkürler! Ayrıca, bir çek ekledim# . Geri bildirim?
mhulse

1
Evet, lider '#' işaretini kaldırmak makul bir korumadır. Kullanması çok daha kolay hex=${1#"#"}. Eğer $1yoksa bir şeyi #çıkarır, varsa onu kaldırır. Güncellenmiş koduma bakın.

Güzel! Çok daha kompakt. Kodumu şimdi güncelleniyor. Teşekkür ederim!!!!
mhulse

En azından xterm versiyonumda \e[0;%s8;2;%s;%s;%smbana 16M renk vermediğini, sadece 240 rgm paletindeki istenen rgb'ye en yakın olan renk verdiğini unutmayın.
Stéphane Chazelas

14

Kısa cevap, renklerin web tablolarında bulabileceğiniz ve renk numaralarıyla eşleştirebileceğinizdir.

Uzun cevap, doğru eşlemenin terminale bağlı olmasıdır.

Bu 125, setafterminal açıklamasında belirtilen bir çıkış dizisinin bir parametresidir . tputsayıya özel bir anlamı yoktur. Bu aslında belirli terminal emülatörüne bağlıdır.

Bir süre önce, ANSI 8 renk kodunu tanımladı ve bunları numaralandırmak için iki şema vardı. İki çifti gibi bir uç açıklamalarında görülür setf/setbya da setaf/setab. İkincisi "ANSI renkleri" çağrışımına sahip olduğundan, daha sık kullanıldığını göreceksiniz. Eski (setf / setb), Ncurses SSS bölümünde belirtildiği gibi kırmızı / mavi sırasını değiştirdi. Neden kırmızı / mavi birbiriyle değiştiriliyor? , ancak her iki durumda da, sadece renkleri numaralandırmak için şema oluşturulmuştur. Bu sayılar ve RGB içeriği arasında önceden tanımlanmış bir ilişki yoktur.

Belirli terminal emülatörleri için, yeterince kolayca numaralandırılabilen ve bu kaçış dizileri kullanılarak programlanabilen önceden tanımlanmış renk paletleri vardır. Orada hiçbir ilgili standartlara, ve terminal taklitleri arasındaki farkları görecektir xterm SSS belirtildiği gibi ben mavi gölgesine sevmiyorum .

Bununla birlikte, sözleşme genellikle standartlarla karıştırılmaktadır. Son 20 yıldaki xterm'in geliştirilmesinde, ANSI (8) renklerini, aixtermözellik (16) renklerini uyarladı, 88 ve 256 renk için uzantıları ekledi. Bunların çoğu, diğer geliştiriciler tarafından farklı terminal emülatörleri için kabul edilmiştir. Bu xterm SSS bölümünde özetlenmiştir. Neden "xterm" i "xterm-256color" ile eşleştirmiyorsunuz? .

Xterm kaynak kodu, renkleri kullanmaya yarayan komut dosyaları, örneğin, tputkullanacak aynı kaçış dizilerini kullanarak içerir.

Bu soruyu / cevabı da faydalı bulabilirsiniz: Ansi genişletilmiş renkler dizinindeki renklerin RGB değerleri (17-255)


Yardımlarınız için çok teşekkür ederim Thomas, Gerçekten minnettarım! İTerm çalıştıran bir Mac / OS X'deyim. Açıklamanız, kurulumum hakkında daha fazla bilgi edinmeme gerçekten yardımcı oluyor (Web’deki diğer birçok insanın renklerinden çok fazla kopya / yapıştırma yaptım). Bana detaylı ve bilgilendirici bir cevap yazmak için zaman ayırdığınız için teşekkür ederim. :)
mhulse

9

Yardımcı tputprogram , terminal özelliklerinden faydalanan 8 bit ANSI çıkış dizilerini ( Escve ile başlayan [) yazdırmak için 256 renkli bir arama tablosu kullanıyor , bu nedenle bu kontrol dizileri renkler olarak yorumlanabilir. Bunlar, grafik kartlarında yaygın olarak kullanılan önceden tanımlanmış 256 renk grubudur.

Terminaldeki tüm 256 rengi yazdırmak için aşağıdaki tek astarı deneyin:

for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done

İpucu: | columnSütun listesine ekleyin .

Bu 256 renkli arama tablosu aşağıdaki gibi Wikipedia sayfasında da bulunabilir :

Grafik;  ANSI çıkış kodu;  Wikipedia'da 8 bit 256 renkli arama tablosu;  256 renkli mod - ön plan: ESC [38; 5; #m arkaplan: ESC [48; 5; #m


3

Zsh ile ve bir in xtermbenzeri terminali ( xtermve vtebenzeri tabanlı terminaller gnome-terminal, xfce4-terminal... en azından), bunu yapabilirsiniz:

$ read -s -t1 -d $'\a' $'c?\e]4;125;?\a' && echo "${c##*;}"
rgb:afaf/0000/5f5f

Bash eşdeğeri:

read -s -t1 -d $'\a' -p $'\e]4;125;?\a' c && echo "${c##*;}"

(kaçış dizisinin , terminal disiplini devre dışı bırakıldıktan sonra gönderilecek rengi sorgulamasını istersiniz echo(ile -s), aksi takdirde cevap, zamanın yarısı çizgi disiplini tarafından görüntülenir, bu nedenle readistemin bir parçası olarak gönderilir ( var?promptzsh ksh gibi, -p promptbash)).

125 renk tanımını elde etmek için (burada bir RGB spesifikasyonu olarak, her sayı Kırmızı, Yeşil ve Mavi bileşenlerin yoğunluğunu onaltılık bir sayı olarak 0 ile FFFF arasındadır).

Aynı şeyi ilk 16 renk için aşağıdaki xtermcontrolkomutu kullanarak yapabilirsiniz:

$ xtermcontrol --get-color1
rgb:cdcd/0000/0000

Müthiş, yardımın için çok teşekkür ederim! +1
mhulse

@Gilles, sorgunun, terminal disiplin eko devre dışı bırakıldıktan sonra bilgi istemi yoluyla gönderilmesini istiyorsunuz. Düzenlemeye bakınız.
Stéphane Chazelas

@ Başka bir terminal programını (gnome-terminal) (Xterm terminali olan) ben (hem bash ve zsh olarak) düzgün çalışabilmesi için kodunuzu var Garibi kullanma StéphaneChazelas: tput colorsraporlar sadece 8terminali 256 renk sunma yeteneğine olsa bile. Ayrıca, xterm-color (Konsole), tput colorsyalnızca 8bu terminal 16 milyon renk sunabiliyor olsa bile (ve elbette tüm 256 rengi de ) rapor eder. Ve hayır, :-) "renklendirebilecek" tmux veya ekran yok (değiştirir) sonuçları (bu detayın farkındaydım). Kısacası: kodunuz bazı terminallerde / konsollarda başarısız olabilir.

Ah, tohex cevabımı ekledi, Beklediğimden biraz daha uzun, ama 256 renk biraz tuhaf dönüşlere sahip.

0

Konsol teriminde ANSI Renkler

Wich süreli protokolü üzerinde konsol kullanımını bağlı olarak, sırası olabilir: \e[38;5;XXXmya \e[3XXXmnerede XXXansi numarasına karşılık gelmektedir.

Doğru ANSI dizisini kullandığınızdan emin olmak için kullanmanız gerekir tput.

Açısından Wikipedia'nın ANSI çıkış kodu , bunu yazdım:

#!/bin/bash


for ((i=0; i<256; i++)) ;do
    echo -n '  '
    tput setab $i
    tput setaf $(( ( (i>231&&i<244 ) || ( (i<17)&& (i%8<2)) ||
        (i>16&&i<232)&& ((i-16)%6 <(i<100?3:2) ) && ((i-16)%36<15) )?7:16))
    printf " C %03d " $i
    tput op
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

Gibi bir şey yapabilir:

görüntü tanımını buraya girin

... Sonra, küçük bir senaryoda 200'den fazla çatal çalıştırmaktan nefret ettiğim için şunu yazdım:

#!/bin/bash

# Connector fifos directory
read TMPDIR < <(mktemp -d /dev/shm/bc_shell_XXXXXXX)

fd=3
# find next free fd
nextFd() { while [ -e /dev/fd/$fd ];do ((fd++)) ;done;printf -v $1 %d $fd;}

tputConnector() {
    mkfifo $TMPDIR/tput
    nextFd TPUTIN
    eval "exec $TPUTIN> >(LANG=C exec stdbuf -o0 tput -S - >$TMPDIR/tput 2>&1)"
    nextFd TPUTOUT
    eval "exec $TPUTOUT<$TMPDIR/tput"
}
myTput() { echo -e "$1\ncr" 1>&$TPUTIN && IFS= read -r -d $'\r' -u $TPUTOUT $2
}
tputConnector

myTput op op
myTput "setaf 7" grey
myTput "setaf 16" black
fore=("$black" "$grey")
for ((i=0; i<256; i++)) ;do
    myTput "setab $i" bgr
    printf "  %s%s  %3d  %s" "$bgr" "${fore[ i>231 && i<244||(i<17)&& (i%8<2)||
        (i>16&&i<232)&&((i-16)%6*11+(i-16)/6%6*14+(i-16)/36*10)<58
        ? 1 : 0 ]}" $i "$op"
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

Sadece 1 çatalla! Aynı sonuç, ama çok daha hızlı!

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.