मैं अपने PS1 प्रॉम्प्ट में किस रंग कोड का उपयोग कर सकता हूं?


131

मैंने अपने PS1 प्रॉम्प्ट में कई रंगों का इस्तेमाल किया जैसे कि

\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

मुझे उन रंग कोड की सूची कहां मिल सकती है जिनका मैं उपयोग कर सकता हूं?

मैंने Colorize Bash Console Color को देखा, लेकिन इसने वास्तविक कोड की सूची के बारे में मेरे प्रश्न का उत्तर नहीं दिया।

यह अच्छा होगा यदि अधिक पठनीय रूप भी हो।

Https://unix.stackexchange.com/a/127800/10043 भी देखें


3
ध्यान दें कि \]यहां अंतिम वास्तव में रंग अनुक्रम का हिस्सा नहीं है; यह विशेष रूप से संकेतों को स्थापित करने में एक उद्देश्य प्रदान करता है (मैंने इस बारे में अपने उत्तर के अंत में कुछ पैराग्राफ जोड़े हैं)। "यह अच्छा होगा यदि एक अधिक पठनीय रूप भी हो।" -> अपने जवाब में कट एन 'पेस्ट ऐसा करने का एक तरीका है।
गोल्डीलॉक्स

जवाबों:


173

वे एएनएसआई से बचने के क्रम हैं ; यह लिंक रंग कोड के एक चार्ट के लिए है, लेकिन उस विकिपीडिया पृष्ठ पर अन्य दिलचस्प चीजें भी हैं। उनमें से सभी एक सामान्य लिनक्स कंसोल पर काम नहीं करते (जैसे)।

यह गलत है:

\033]00m\] # white

0टर्मिनल को उसके डिफ़ॉल्ट पर रीसेट करता है (जो संभवतः सफेद है)। सफेद अग्रभूमि के लिए वास्तविक कोड 37 है। इसके अलावा, अंत में ( \]भाग) बचे हुए ब्रेस रंग अनुक्रम का हिस्सा नहीं है (शीघ्र सेट करने में उनके उद्देश्य की व्याख्या के लिए नीचे कुछ अंतिम पैराग्राफ देखें)।

ध्यान दें कि कुछ GUI टर्मिनल आपको एक अनुकूलित रंग योजना निर्दिष्ट करने की अनुमति देते हैं। इससे आउटपुट प्रभावित होगा।

नहीं है यहाँ एक सूची है जो 7 अग्रभूमि और 7 पृष्ठभूमि रंग मैंने पहले नहीं देखा था कहते हैं, लेकिन वे काम करने के लिए लग रहे हैं:

# 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 

इसके अलावा, यदि आपके पास 256 रंग का जीयूआई टर्मिनल है (मुझे लगता है कि उनमें से अधिकांश अब हैं), तो आप इस चार्ट से रंग लागू कर सकते हैं:

xterm 256 कलर चार्ट

इन्हें चुनने के लिए एएनएसआई अनुक्रम, नीचे बाएं कोने में संख्या का उपयोग करते 38;5;हुए अग्रभूमि और 48;5;पृष्ठभूमि के लिए शुरू होता है , फिर रंग संख्या, इसलिए जैसे:

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

मुझे तन पर एक हल्का नारंगी देता है (मतलब, रंग चार्ट लगभग अनुमानित है)।

आप इस चार्ट 1 में रंग देख सकते हैं क्योंकि वे आपके टर्मिनल पर आसानी से दिखाई देंगे:

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

आउटपुट स्व-व्याख्यात्मक है।

कुछ सिस्टम $ TERM वेरिएबल को सेट करते xterm-256colorहैं यदि आप 256 कलर टर्मिनल पर किसी शेल कोड के माध्यम से होते हैं /etc/profile। दूसरों पर, आपको इसका उपयोग करने के लिए अपने टर्मिनल को कॉन्फ़िगर करने में सक्षम होना चाहिए। बता दें कि TUI एप्लिकेशन 256 रंग हैं, और आपको कुछ इस तरह जोड़ने की अनुमति देता है ~/.bashrc:

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

खबरदार कि जब आप अपने प्रॉम्प्ट में कलर एस्केप सीक्वेंस का इस्तेमाल करते हैं, तो आपको उन्हें \इस तरह से एस्कैप्ड ( उपसर्ग) स्क्वायर ब्रैकेट में संलग्न करना चाहिए :

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

ध्यान दें कि [रंग क्रम में आंतरिक भाग नहीं है, लेकिन संलग्नक हैं। उत्तरार्द्ध का उद्देश्य शेल को इंगित करना है कि संलग्न अनुक्रम प्रॉम्प्ट की चरित्र लंबाई की ओर नहीं गिना जाता है। यदि वह गिनती गलत है, तो अजीब चीजें तब होंगी जब आप इतिहास के माध्यम से वापस स्क्रॉल करेंगे, उदाहरण के लिए, यदि यह बहुत लंबा है, तो अंतिम स्क्रॉल स्ट्रिंग की अतिरिक्त लंबाई आपके प्रॉम्प्ट से जुड़ी होगी और आप बैकस्पेस में सक्षम नहीं होंगे यह (यह उसी तरह से नजरअंदाज कर दिया गया है)।

यह भी ध्यान दें कि यदि आप हर बार प्रॉम्प्ट का उपयोग करते हुए कमांड कमांड के आउटपुट को शामिल करना चाहते हैं (जैसा कि प्रॉम्प्ट सेट होने पर बस एक बार विरोध किया जाता है), तो आपको इसे सिंगल कोट्स के साथ शाब्दिक स्ट्रिंग के रूप में सेट करना चाहिए, जैसे:

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

हालांकि यह एक बहुत अच्छा उदाहरण नहीं है यदि आप बैश के विशेष \dया \D{format}शीघ्र भागने से खुश हैं - जो प्रश्न का विषय नहीं हैं, लेकिन इसके man bashतहत पाया जा सकता है PROMPTING\wवर्तमान निर्देशिका के लिए, \uवर्तमान उपयोगकर्ता के लिए, आदि जैसे कई अन्य उपयोगी भाग हैं ।


1. इस चार्ट का मुख्य भाग, रंग 16 - 231 (ध्यान दें कि वे संख्यात्मक क्रम में नहीं हैं) 6 x 6 x 6 RGB रंग घन हैं। "कलर क्यूब" इस तथ्य को संदर्भित करता है कि एक आरजीबी रंग स्थान को तीन आयामी सरणी (लाल रंग के लिए एक अक्ष के साथ, हरे रंग के लिए एक, और नीले रंग के लिए एक) का उपयोग करके प्रतिनिधित्व किया जा सकता है। यहाँ घन में प्रत्येक रंग को 6 x 6 x 6 सरणी में निर्देशांक के रूप में दर्शाया जा सकता है, और चार्ट में सूचकांक इस प्रकार गणना की जाती है:

    16 + R * 36 + G * 6 + B

चार्ट में सूचकांक 16 पर क्यूब में पहला रंग काला है (आरजीबी 0, 0, 0)। आप शेल स्क्रिप्ट में इस सूत्र का उपयोग कर सकते हैं:

#!/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
मैं मूल प्रश्नकर्ता को टेस्ट चार्ट के साथ रंग उपलब्धता का परीक्षण करने का सुझाव देता हूं। यहां एक है: robmeerman.co.uk/unix/… या यह एक करना बहुत आसान हो सकता है, अगर कोई इंटरनेट पर पाई गई शेल स्क्रिप्ट पर भरोसा नहीं करता है।
आईबीआर

1
@ आईबीआर दिलचस्प बिंदु। बस सभी रंगों को देखना एक ड्रॉप डेड सिंपल टास्क है, इसलिए मुझे ऐसा करने के लिए ऊपर कुछ बैश की लाइनें दिखाई देती हैं।
गोल्डीलॉक्स

यहां मिली रंग संदर्भ स्क्रिप्ट अधिक उपयोगी हो सकती है, कॉम्पैक्ट होने के बावजूद अभी भी कोड के साथ और प्रत्येक रंग स्पष्टता के लिए अलग है।
माइकल प्लॉटके

1
कृपया, echoशाब्दिक पाठ के अलावा किसी अन्य चीज़ के लिए उपयोग न करें जो डैश ( -) के साथ शुरू नहीं होती है । यह अस्थिर है। सभी सामान्य कार्यान्वयन मानक का उल्लंघन करते हैं जो बताता है कि किसी भी विकल्प का समर्थन नहीं किया जाना चाहिए। इससे भी बदतर, वे असंगत हैं। आपको printfइसके बजाय उपयोग करना चाहिए । (और %s
प्रिंटफ

2
colortest-256xterm pallette को एक अच्छे कॉम्पैक्ट रूप में सूचीबद्ध करें। ( apt-get install colortestअगर गायब है)
वोल्कर सीगल

38

ऐसा लगता है कि सूची में से कुछ कम से कम है:

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 पर आधारित है


2
वास्तव में प्रयोग करने योग्य तार प्रदान करने के लिए धन्यवाद।
lbutlr

21

मैंने एक बैश फ़ंक्शन लिखा है जो आपको सभी रंग दिखा सकता है, अगर यह मदद करता है।

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
}

आप इसे एक .bashrc / .bash_profile / .bash_aliases में फेंक सकते हैं या इसे स्क्रिप्ट के रूप में सहेज सकते हैं और इसे इस तरह से चला सकते हैं। आप रंग बदलने के लिए रंगों का उपयोग कर सकते हैं जैसे मैंने नीचे अपने नाम के साथ किया था।

colorgrid () आउटपुट: Colorgrid का उत्पादन ()

मैंने ऐसा करने से अपना नाम अपने .bash_profile में बदल दिया:

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 "

ध्यान दें कि एक स्ट्रिंग में 01 उपसर्ग \[\033[01;38;5;214m\]a इसे बोल्ड होने के लिए सेट करता है।


3
मुझे खुशी है कि मैंने इसे साझा किया। आज कम छिपाने के लिए एक बाशचे और टर्मिनल सेटअप को ठीक करने का काम आया। बस तारीख भी देखी - यह 2 साल पहले कल होगा।
प्लाज्माब्रो

12

रंग प्रदर्शित करने के लिए TAFKA 'गोल्डीलॉक्स' द्वारा पोस्ट की गई एक और स्क्रिप्ट जो कि संदर्भ उद्देश्यों के लिए शायद थोड़ी अधिक व्यावहारिक है:

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

यह आपके द्वारा उपयोग किए जा रहे टर्मिनल के लिए सही आकार का होना चाहिए। यह इस उद्देश्य के लिए सबसे ऊपर है, लेकिन अब आप कई पहलुओं को नियंत्रित कर सकते हैं कि यह मापदंडों के माध्यम से कैसे प्रदर्शित होता है। उम्मीद है, वे सभी आत्म व्याख्यात्मक हैं।


1
ओवरकिल की तरह कोई मार नहीं :)
नवीं

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