tput setaf रंग तालिका? रंग कोड का निर्धारण कैसे करें?


79

मैं अपने टर्मिनल को रंग देने की प्रक्रिया में हूं PS1

मैं उपयोग कर रंग चर सेट कर रहा हूं tput; उदाहरण के लिए, यहाँ बैंगनी है:

PURPLE=$(tput setaf 125)

सवाल:

मुझे 125अन्य रंगों के रंग कोड (जैसे ) कैसे मिलेंगे ?

कहीं कलर टेबल गाइड / चीट शीट है?

मुझे यकीन नहीं है कि क्या 125है ... क्या हेक्स रंग लेने और संख्या में परिवर्तित होने का कोई तरीका है जो setafउपयोग कर सकता है?


जवाबों:


152

Tput को उपलब्ध रंगों की गिनती द्वारा दिया गया है tput colors

मूल 8 रंगों को देखने के लिए (जैसा कि setfurxvt टर्मिनल और setafxterm टर्मिनल में उपयोग किया जाता है ):

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

और आमतौर पर इस नाम के रूप में:

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

विस्तारित 256 रंगों को देखने के लिए (जैसा कि setafurxvt द्वारा उपयोग किया गया है):

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

यदि आप संख्याएँ चाहते हैं और एक आउटपुट दिया गया है:

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

अनुक्रम में 256 रंग चार्ट, उनके सूचकांक के साथ लेबल किए गए


16 मिलियन रंगों को कोड की काफी आवश्यकता है (कुछ कंसोल यह नहीं दिखा सकते हैं)।
मूल बातें हैं:

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

fbहै front/backया 3/4

इतने सारे रंगों को प्रस्तुत करने के लिए आपकी कंसोल क्षमता का एक सरल परीक्षण है:

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

लाल रेखा, गहरे रंग से प्रकाश की ओर लुढ़कना (बाएं से दाएं) यह बाएं से दाएं स्वर में बहुत छोटे बदलाव के साथ एक लाल रेखा पेश करेगा। यदि वह छोटा परिवर्तन दिखाई देता है, तो आपका कंसोल 16 मिलियन रंगों में सक्षम है।

प्रत्येक r, gऔर bRGB (लाल, हरा, नीला) के लिए 0 से 255 तक का मूल्य है।

यदि आपका कंसोल प्रकार इसका समर्थन करता है, तो यह कोड एक रंग तालिका बनाएगा:

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

लेबल के रूप में उनके सूचकांक के साथ नमूना अग्रभूमि रंगों का चार्ट

लेबल के रूप में उनके सूचकांक के साथ नमूना पृष्ठभूमि रंगों का चार्ट

एक हेक्स रंग मान को परिवर्तित करने के लिए (निकटतम) 0-255 रंग सूचकांक:

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 ))"
}

इसे इस रूप में उपयोग करें:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

HTML रंग प्रारूप में उपयोग किए गए रंग नंबर को खोजने के लिए :

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

इसका उपयोग करें ("मूल" पहले 16 रंग हैं, "रंग" मुख्य समूह है, "ग्रे" अंतिम ग्रे रंग है):

$ 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 फ़ंक्शन बहुत अच्छा है! बहुत बहुत धन्यवाद!
mululse

लविन ’ fromhex। एक बार फिर धन्यवाद! इसके अलावा, मैंने इसके लिए एक चेक जोड़ा# । प्रतिपुष्टि?
म्हलसे

1
हां, एक प्रमुख '#' को हटाना एक उचित सुरक्षा है। मुझे उपयोग करने के लिए बहुत सरल लगता है hex=${1#"#"}। यह कुछ भी नहीं हटाएगा यदि $1उसके पास नहीं है #, और यदि मौजूद है तो उसे हटा दें। मेरा अद्यतन कोड देखें।

अच्छा! बहुत अधिक कॉम्पैक्ट। अब मेरा कोड अपडेट कर रहा है। धन्यवाद!!!!
म्हुलसे

ध्यान दें कि कम से कम मेरे xterm के संस्करण में \e[0;%s8;2;%s;%s;%smमुझे 16M रंग नहीं दिए गए हैं, बस 240 रंग पैलेट में रंग जो अनुरोधित आरजीबी के सबसे करीब है।
स्टीफन चेज़लस

14

संक्षिप्त उत्तर यह है कि आप रंगों के वेब टेबल पर पा सकते हैं और उन्हें रंग संख्या तक मिलान कर सकते हैं।

लंबा उत्तर यह है कि सही मैपिंग टर्मिनल पर निर्भर करती है -

125एक एस्केप अनुक्रम के रूप में भेजा के लिए एक पैरामीटर है setafटर्मिनल वर्णन में। tputसंख्या के लिए कोई विशेष अर्थ नहीं देता है। यह वास्तव में विशेष टर्मिनल एमुलेटर पर निर्भर करता है।

कुछ समय पहले, एएनएसआई ने 8 रंगों के लिए कोड परिभाषित किए थे, और उन लोगों की संख्या के लिए दो योजनाएं थीं। दोनों को कुछ टर्मिनल विवरणों में जोड़े setf/setbया के रूप में देखा जाता है setaf/setab। चूंकि उत्तरार्द्ध में "एएनएसआई रंग" का अर्थ है, आप देखेंगे कि इसका उपयोग अधिक बार किया जाता है। पूर्व (सेट / सेटब) ने लाल / नीले रंग के आदेश को स्विच किया जैसा कि ncurses में उल्लेख किया गया है। क्यों लाल / नीले परस्पर जुड़े हुए हैं? , लेकिन दोनों ही मामलों में, यह योजना सिर्फ रंगों की संख्या के लिए स्थापित की गई थी। उन संख्याओं और RGB सामग्री के बीच कोई पूर्वनिर्धारित संबंध नहीं है।

विशिष्ट टर्मिनल एमुलेटर के लिए, पूर्वनिर्धारित रंग पट्टियाँ होती हैं जिन्हें आसानी से पर्याप्त रूप से एनुमरेट किया जा सकता है - और इन एस्केप अनुक्रमों का उपयोग करके प्रोग्राम किया जा सकता है। कोई प्रासंगिक मानक नहीं हैं , और आप टर्मिनल एमुलेटर के बीच अंतर देखेंगे, जैसा कि एक्सटर्म एफएक्यू में उल्लेख किया गया है कि मुझे नीला रंग पसंद नहीं है

हालांकि, सम्मेलन अक्सर मानकों के साथ भ्रमित होता है। पिछले 20 वर्षों में एक्सटर्म के विकास में, इसने एएनएसआई (8) रंगों को शामिल किया, aixtermफीचर (16) रंगों को अनुकूलित किया , 88- और 256-रंगों के लिए एक्सटेंशन जोड़े। इनमें से अधिकांश को अन्य डेवलपर्स ने विभिन्न टर्मिनल एमुलेटर के लिए अपनाया है। यह xterm में संक्षेप में प्रस्तुत किया गया है क्यों "xterm" को "xterm-256color" के बराबर नहीं बनाया जाता है?

Xterm स्रोत-कोड में रंगों का प्रदर्शन करने के लिए स्क्रिप्ट शामिल हैं, उदाहरण के लिए, एक ही एस्केप सीक्वेंस tputका उपयोग करके।

आपको यह प्रश्न / उत्तर सहायक के रूप में अच्छी तरह से मिल सकता है: Ansi विस्तारित रंग सूचकांक में रंगों के RGB मान (17-255)


आपकी मदद थॉमस के लिए बहुत बहुत धन्यवाद, मैं वास्तव में इसकी सराहना करता हूं! मैं मैक / OS X पर iTerm चला रहा हूं। आपका स्पष्टीकरण वास्तव में मुझे मेरे सेटअप के बारे में अधिक समझने में मदद करता है (मैंने वेब पर विभिन्न लोगों के शीघ्र रंगों से बहुत कॉपी / पेस्ट किया है)। मैं वास्तव में मुझे एक विस्तृत और जानकारीपूर्ण उत्तर लिखने के लिए समय देने के लिए आपकी सराहना करता हूं। :)
मुहल्ले

9

tputउपयोगिता मुद्रित करने के लिए एक 256-रंग लुकअप तालिका उपयोग कर रहा है 8 बिट एएनएसआई भागने दृश्यों (के साथ शुरू Escऔर [) जो का उपयोग करता है टर्मिनल क्षमताओं , इसलिए इन पर नियंत्रण के दृश्यों रंग के रूप में व्याख्या की जा सकती। ये ग्राफिक कार्ड में आमतौर पर इस्तेमाल किए जाने वाले 256 रंगों का पूर्व-निर्धारित सेट हैं।

टर्मिनल में सभी 256 रंगों को मुद्रित करने के लिए, निम्नलिखित एक-लाइनर का प्रयास करें:

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

संकेत: | columnस्तंभ सूची में जोड़ें ।

इस 256-रंग लुकअप तालिका को विकिपीडिया पृष्ठ पर निम्नानुसार पाया जा सकता है :

चार्ट;  एएनएसआई बच कोड;  विकिपीडिया पर 8-बिट 256-रंग लुकअप तालिका;  256-रंग मोड - अग्रभूमि: ESC [38; 5; # m पृष्ठभूमि: ESC [48; 5; #m


3

Zsh और एक समान xtermटर्मिनल ( xtermऔर- vteजैसे टर्मिनलों की तरह gnome-terminal, xfce4-terminal... कम से कम) के साथ, आप कर सकते हैं:

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

बैश समकक्ष:

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

(आप चाहते हैं कि टर्मिनल अनुशासन अक्षम होने के बाद भेजे जाने वाले रंग को क्वेरी करने के लिए भागने का क्रम echo(के साथ -s) अन्यथा पंक्ति के अनुक्रिया आधे समय तक प्रदर्शित होगी, इसलिए इसे readप्रांप्ट के भाग के रूप var?promptमें भेजना ( zsh में) जैसे ksh में, -p promptबैश में))।

125 की परिभाषा प्राप्त करने के लिए (यहां RGB विनिर्देश के रूप में, प्रत्येक संख्या 0 और FFFF के बीच एक हेक्स संख्या के रूप में लाल, हरे और नीले घटकों की तीव्रता है)।

आप xtermcontrolकमांड के साथ पहले 16 रंगों के लिए भी ऐसा कर सकते हैं :

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

बहुत बढ़िया, मदद के लिए बहुत बहुत धन्यवाद! +1
मुहल्लेसे

@ गिल्स, आप चाहते हैं कि टर्मिनल डिस्क्रिप्शन इको डिसेबल होने के बाद क्वैरी को प्रांप्ट के जरिए भेजा जाए। संपादित देखें।
स्टीफन चेजलस

@ StéphaneChazelas एक अन्य टर्मिनल प्रोग्राम (सूक्ति-टर्मिनल) (जो एक xterm टर्मिनल है) का उपयोग करना। मुझे आपका कोड सही ढंग से काम करने के लिए मिला है (दोनों बाश और zsh में) अजीब तरह से पर्याप्त: tput colorsरिपोर्ट केवल 8भले ही टर्मिनल 256 रंगों को पेश करने में सक्षम हो। इसके अलावा, xterm-color (Konsole) tput colorsकेवल रिपोर्ट करता है, 8भले ही वह टर्मिनल 16 मिलियन रंगों (और सभी 256 रंगों, निश्चित रूप से) को पेश करने में पूरी तरह से सक्षम हो। और नहीं, कोई tmux या स्क्रीन जो "रंग" :-) (परिवर्तन जो है) परिणाम हो सकता है (मुझे उस विवरण के बारे में पता था)। संक्षेप में: आपका कोड कुछ टर्मिनल / कंसोल में विफल हो सकता है।

आह, tohex ने मेरे जवाब में जोड़ा, जो मैं उम्मीद कर रहा था, उससे थोड़ा अधिक, लेकिन 256 रंगों में काफी विचित्र मोड़ हैं।

0

कंसोल टर्म पर ANSI कलर्स

विच टर्म प्रोटोकॉल के आधार पर आपके कंसोल का उपयोग, अनुक्रम हो सकता है: \e[38;5;XXXmया \e[3XXXmजहां XXXएएनआई नंबर के अनुरूप हैं।

यह सुनिश्चित करने के लिए कि आप सही ANSI अनुक्रम का उपयोग करते हैं, आपको उपयोग करना होगा tput

के बारे में विकिपीडिया के एएनएसआई भागने कोड , मैं यह लिखा:

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

कुछ इस तरह प्रस्तुत कर सकता है:

यहाँ छवि विवरण दर्ज करें

... फिर, क्योंकि मुझे थोड़ी स्क्रिप्ट में 200 से अधिक कांटों से रननिग से नफरत है, मैंने इसे लिखा है:

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

केवल 1 कांटा के साथ! एक ही परिणाम है, लेकिन बहुत तेज!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.