ฉันสามารถใช้รหัสสีใดในการแจ้งเตือน PS1 ของฉัน


132

ฉันใช้หลายสีในพรอมต์ 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
โปรดทราบว่าสุดท้าย\]ที่นี่ไม่ได้เป็นส่วนหนึ่งของลำดับสี มันมีจุดประสงค์ในการตั้งค่าให้พร้อมท์โดยเฉพาะ (ฉันได้เพิ่มวรรคสองสามข้อต่อท้ายคำตอบของฉันเกี่ยวกับเรื่องนี้) "มันคงจะดีถ้ามีรูปแบบที่อ่านได้อีกด้วย" -> วาง cut n 'ในคำตอบของคุณเองเป็นวิธีหนึ่งในการทำเช่นนี้
goldilocks

คำตอบ:


174

นั่นคือลำดับการหลบหนีของ ANSI ; ลิงค์นั้นเป็นแผนภูมิรหัสสี แต่มีสิ่งที่น่าสนใจอื่น ๆ ในหน้า Wikipedia นั้นเช่นกัน ไม่ใช่ทุกคนที่ทำงานบน (เช่น) คอนโซล Linux ปกติ

สิ่งนี้ไม่ถูกต้อง:

\033]00m\] # white

0รีเซ็ตเทอร์มินัลเป็นค่าเริ่มต้น (ซึ่งอาจเป็นสีขาว) รหัสจริงสำหรับพื้นหน้าสีขาวคือ 37 นอกจากนี้วงเล็บปิดที่ใช้ Escape ที่ท้าย ( \]) ไม่ได้เป็นส่วนหนึ่งของลำดับสี (ดูวรรคสองสามข้อสุดท้ายด้านล่าง

โปรดทราบว่าเทอร์มินัล 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 

นอกจากนี้หากคุณมีเทอร์มินัล GUI 256 สี (ฉันคิดว่าส่วนใหญ่เป็นเทอร์มินัล) คุณสามารถใช้สีจากแผนภูมินี้:

แผนภูมิสี xterm 256

ลำดับ ANSI เพื่อเลือกสิ่งเหล่านี้โดยใช้หมายเลขที่มุมซ้ายล่างเริ่มต้น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 (สังเกตว่าไม่อยู่ในลำดับตัวเลข) คือลูกบาศก์สี RGB 6 x 6 x 6 "คิวบ์สี" หมายถึงความจริงที่ว่าพื้นที่สี RGB สามารถแสดงโดยใช้อาร์เรย์สามมิติ (โดยมีแกนหนึ่งสำหรับสีแดงหนึ่งสำหรับสีเขียวและอีกหนึ่งสำหรับสีฟ้า) แต่ละสีในคิวบ์ที่นี่สามารถแสดงเป็นพิกัดในอาร์เรย์ 6 x 6 x 6 และดัชนีในแผนภูมิคำนวณได้ดังนี้:

    16 + R * 36 + G * 6 + B

สีแรกในลูกบาศก์ที่ดัชนี 16 ในแผนภูมิคือสีดำ (RGB 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/ …หรืออาจเป็นเรื่องง่ายที่จะทำอย่างใดอย่างหนึ่งหากไม่เชื่อถือเชลล์สคริปต์ที่พบในอินเทอร์เน็ต
IBr

1
@ IBr จุดที่น่าสนใจ เพียงแค่ดูทุกสีเป็นเรื่องง่าย ๆ ที่ทำให้ฉันตายดังนั้นฉันจึงทุบตีสองสามบรรทัดเพื่อทำสิ่งนี้
goldilocks

สคริปต์อ้างอิงสีที่พบที่นี่อาจมีประโยชน์มากกว่าเนื่องจากมีขนาดกะทัดรัด แต่ยังคงมีรหัสอยู่และแยกแต่ละสีเพื่อความชัดเจน
Michael Plotke

1
โปรดอย่าใช้echoเพื่อสิ่งอื่นใดนอกจากตัวอักษรที่ไม่ได้ขึ้นต้นด้วยขีดกลาง ( -) มันไม่สามารถพูดได้ การใช้งานทั่วไปทั้งหมดละเมิดมาตรฐานซึ่งระบุว่าไม่มีตัวเลือกที่ควรได้รับการสนับสนุน ที่เลวร้ายยิ่งพวกเขาไม่สอดคล้องกัน คุณควรใช้printfแทน (และอย่าฝังตัวแปรภายในข้อความสั่ง printf, use %s.)
nyuszika7h

2
colortest-256รายชื่อ palette xterm ในรูปแบบกะทัดรัดดี ( apt-get install colortestหากหายไป)
Volker Siegel

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
ฉันดีใจจริงๆที่ฉันแบ่งปันสิ่งนี้ มีประโยชน์ในวันนี้แก้ไขการตั้งค่า bashrc และเทอร์มินัลให้น่าเกลียดน้อยลง เพิ่งเห็นวันที่เช่นกันพรุ่งนี้จะเป็น 2 ปีแล้ว
Plasmarob

12

สคริปต์อื่นเช่นสคริปต์ที่โพสต์โดย TAFKA 'goldilocks' สำหรับการแสดงสีซึ่งอาจเป็นประโยชน์มากกว่าสำหรับการอ้างอิง:

#!/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
ไม่มีการฆ่าเหมือน overkill :)
Navin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.