Tôi có thể sử dụng mã màu nào trong lời nhắc PS1?


132

Tôi đã sử dụng một số màu trong dấu nhắc PS1 của mình, chẳng hạn như

\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

Tôi có thể tìm danh sách mã màu tôi có thể sử dụng ở đâu?

Tôi đã xem Colorize Bash Console Color nhưng nó không trả lời câu hỏi của tôi về danh sách mã thực tế.

Sẽ thật tuyệt nếu có một hình thức dễ đọc hơn.

Xem thêm https://unix.stackexchange.com/a/127800/10043


3
Lưu ý rằng trận chung kết \]ở đây thực sự không phải là một phần của chuỗi màu; nó phục vụ một mục đích trong việc thiết lập các lời nhắc cụ thể (tôi đã thêm một vài đoạn vào cuối câu trả lời của tôi về điều này). "Sẽ thật tuyệt nếu có một hình thức dễ đọc hơn nữa." -> cắt n 'dán trong câu trả lời của riêng bạn là một cách để làm điều này.
goldilocks

Câu trả lời:


174

Đó là các chuỗi thoát ANSI ; liên kết đó là một biểu đồ mã màu nhưng cũng có những điều thú vị khác trên trang Wikipedia đó. Không phải tất cả chúng đều hoạt động trên (ví dụ) một giao diện điều khiển Linux bình thường.

Điều này là không đúng:

\033]00m\] # white

0đặt lại thiết bị đầu cuối về mặc định của nó (có lẽ là màu trắng). Mã thực tế cho tiền cảnh màu trắng là 37. Ngoài ra, dấu ngoặc đóng thoát ở cuối ( \]) không phải là một phần của chuỗi màu (xem một vài đoạn cuối dưới đây để được giải thích về mục đích của chúng khi đặt dấu nhắc).

Lưu ý rằng một số thiết bị đầu cuối GUI cho phép bạn chỉ định bảng màu tùy chỉnh. Điều này sẽ ảnh hưởng đến đầu ra.

một danh sách ở đây có thêm 7 màu nền trước và 7 màu nền mà tôi chưa từng thấy trước đây, nhưng chúng dường như hoạt động:

# 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 

Ngoài ra, nếu bạn có thiết bị đầu cuối GUI 256 màu (tôi nghĩ rằng hầu hết trong số chúng hiện nay), bạn có thể áp dụng màu từ biểu đồ này:

biểu đồ xterm 256

Trình tự ANSI để chọn các số này, sử dụng số ở góc dưới bên trái, bắt đầu 38;5;cho nền trước và 48;5;cho nền, sau đó là số màu, ví dụ:

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

Cung cấp cho tôi một màu cam nhạt trên da nâu (có nghĩa là biểu đồ màu gần đúng).

Bạn có thể thấy các màu trong biểu đồ 1 này vì chúng sẽ xuất hiện trên thiết bị đầu cuối của bạn khá dễ dàng:

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

Đầu ra là tự giải thích.

Một số hệ thống đặt biến $ TERM thành xterm-256colornếu bạn đang ở trên thiết bị đầu cuối 256 màu thông qua một số mã vỏ /etc/profile. Trên những người khác, bạn sẽ có thể cấu hình thiết bị đầu cuối của bạn để sử dụng này. Điều đó sẽ cho các ứng dụng TUI biết có 256 màu và cho phép bạn thêm một cái gì đó như thế này vào ~/.bashrc:

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

Xin lưu ý rằng khi bạn sử dụng các chuỗi thoát màu trong lời nhắc của mình, bạn nên đặt chúng trong \các dấu ngoặc vuông thoát ( tiền tố), như sau:

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

Lưu ý phần [bên trong của chuỗi màu không được thoát, nhưng phần bên trong là. Mục đích của cái sau là để chỉ ra cho shell rằng chuỗi được đính kèm không được tính vào chiều dài ký tự của dấu nhắc. Nếu số đó sai, những điều kỳ lạ sẽ xảy ra khi bạn cuộn qua lịch sử, ví dụ: nếu quá dài, độ dài quá mức của chuỗi cuộn cuối cùng sẽ xuất hiện được đính kèm với lời nhắc của bạn và bạn sẽ không thể lùi lại vào nó (nó bị bỏ qua giống như cách nhắc nhở).

Cũng lưu ý rằng nếu bạn muốn bao gồm đầu ra của lệnh chạy mỗi khi dấu nhắc được sử dụng (trái ngược với chỉ một lần khi lời nhắc được đặt), bạn nên đặt nó dưới dạng một chuỗi bằng chữ với các dấu ngoặc đơn, ví dụ:

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

Mặc dù đây không phải là một ví dụ tuyệt vời nếu bạn hài lòng với việc sử dụng các lối thoát đặc biệt \dhoặc \D{format}nhanh chóng của bash - không phải là chủ đề của câu hỏi nhưng có thể được tìm thấy ở man bashbên dưới PROMPTING. Có nhiều lối thoát hữu ích khác như \wthư mục hiện tại, \ucho người dùng hiện tại, v.v.


1. Phần chính của biểu đồ này, màu 16 - 231 (lưu ý rằng chúng không theo thứ tự số) là một khối màu 6 x 6 x 6 RGB. "Khối màu" đề cập đến thực tế là không gian màu RGB có thể được biểu diễn bằng mảng ba chiều (với một trục cho màu đỏ, một cho màu xanh lục và một cho màu xanh lam). Mỗi màu trong khối ở đây có thể được biểu diễn dưới dạng tọa độ trong một mảng 6 x 6 x 6 và chỉ số trong biểu đồ được tính như vậy:

    16 + R * 36 + G * 6 + B

Màu đầu tiên trong khối, ở chỉ số 16 trong biểu đồ, là màu đen (RGB 0, 0, 0). Bạn có thể sử dụng công thức này trong shell script:

#!/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
Tôi đề nghị người hỏi ban đầu kiểm tra tính khả dụng của màu với biểu đồ kiểm tra. Có một cái ở đây: robmeerman.co.uk/unix/ cấp hoặc có thể rất dễ thực hiện, nếu một người không tin tưởng các tập lệnh shell được tìm thấy trên internet.
IBr

1
@IBr Điểm thú vị. Chỉ cần xem tất cả các màu sắc là một nhiệm vụ đơn giản, vì vậy tôi có vài dòng bash ở trên để làm điều này.
goldilocks

Tập lệnh tham chiếu màu được tìm thấy ở đây có thể hữu ích hơn, nhỏ gọn hơn nhưng vẫn có mã và với mỗi màu được phân tách rõ ràng.
Michael Plotke

1
Xin vui lòng, không sử dụng echocho bất cứ điều gì khác ngoài văn bản bằng chữ không bắt đầu bằng dấu gạch ngang ( -). Nó không thể truy cập được. Tất cả các triển khai phổ biến đều vi phạm tiêu chuẩn quy định rằng không có tùy chọn nào được hỗ trợ. Tệ hơn, chúng không nhất quán. Bạn nên sử dụng printfthay thế. (Và không nhúng các biến trong các câu lệnh printf, sử dụng %s.)
nyuszika7h

2
colortest-256liệt kê các pallet xterm trong một hình thức nhỏ gọn đẹp. ( apt-get install colortestnếu mất tích)
Volker Siegel

38

Có vẻ như ít nhất một số trong danh sách là:

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

dựa trên https://wiki.archlinux.org/index.php/Color_Bash_Prompt


2
Cảm ơn bạn cuối cùng đã cung cấp các chuỗi thực sự có thể sử dụng.
lbutlr

21

Tôi đã viết một hàm bash có thể hiển thị cho bạn tất cả các màu, nếu điều này có ích.

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
}

Bạn có thể ném nó trong .bashrc / .bash_profile / .bash_aliases hoặc lưu nó dưới dạng tập lệnh và chạy theo cách đó. Bạn có thể sử dụng màu sắc để thay đổi màu sắc như tôi đã làm với tên của tôi dưới đây.

đầu ra colorgrid (): Đầu ra của colorgrid ()

Tôi đã thay đổi tên của mình trong .bash_profile bằng cách này:

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 "

Lưu ý rằng 01 tiền tố trong một chuỗi như \[\033[01;38;5;214m\]a đặt nó thành đậm.


3
Tôi thực sự vui mừng vì tôi đã chia sẻ điều này. hôm nay đã có ích trong việc sửa lỗi bashrc và thiết lập đầu cuối để bớt gớm ghiếc. Chỉ cần nhìn thấy ngày - nó sẽ là 2 năm trước vào ngày mai.
Plasmarob

12

Một kịch bản khác giống như kịch bản được đăng bởi TAFKA 'goldilocks' để hiển thị màu sắc có thể thực tế hơn một chút cho mục đích tham khảo:

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

Điều này sẽ kích thước chính xác cho các thiết bị đầu cuối bạn đang sử dụng. Nó hơi vượt trội so với mục đích này nhưng bây giờ bạn có thể kiểm soát nhiều khía cạnh về cách hiển thị thông qua các tham số. Hy vọng, tất cả họ đều tự giải thích.


1
Không giết như quá mức cần thiết :)
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\]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.