Kode warna apa yang dapat saya gunakan di PS1 prompt saya?

132

Saya menggunakan beberapa warna di prompt PS1 saya seperti

\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

Di mana saya dapat menemukan daftar kode warna yang dapat saya gunakan?

Saya melihat Colorize Bash Console Color tetapi tidak menjawab pertanyaan saya tentang daftar kode yang sebenarnya.

Akan lebih baik jika ada bentuk yang lebih mudah dibaca juga.

Lihat juga https://unix.stackexchange.com/a/127800/10043

Michael Durrant
sumber
3
Perhatikan bahwa akhir di \]sini sebenarnya bukan bagian dari urutan warna; itu melayani tujuan dalam pengaturan meminta secara khusus (saya telah menambahkan beberapa paragraf di akhir jawaban saya tentang ini). "Akan lebih baik jika ada bentuk yang lebih mudah dibaca juga." -> cut n 'paste dalam jawaban Anda sendiri adalah salah satu cara untuk melakukan ini.
goldilocks

Jawaban:

174

Itu adalah urutan pelarian ANSI ; tautan itu adalah bagan kode warna tetapi ada hal-hal menarik lainnya pada halaman Wikipedia itu juga. Tidak semuanya bekerja pada (misalnya) konsol Linux normal.

Ini salah:

\033]00m\] # white

0me-reset terminal ke default-nya (yang mungkin putih). Kode aktual untuk foreground putih adalah 37. Juga, tanda kurung tutup yang keluar di akhir ( \]) bukan bagian dari urutan warna (lihat beberapa paragraf terakhir di bawah ini untuk penjelasan tujuan mereka dalam mengatur prompt).

Perhatikan bahwa beberapa terminal GUI memungkinkan Anda menentukan skema warna yang disesuaikan. Ini akan mempengaruhi output.

Ada daftar di sini yang menambahkan 7 warna latar depan dan 7 warna latar belakang yang belum pernah saya lihat sebelumnya, tetapi tampaknya berhasil:

# 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 

Selain itu, jika Anda memiliki terminal GUI 256 warna (saya pikir sebagian besar dari mereka sekarang), Anda dapat menerapkan warna dari grafik ini:

bagan warna xterm 256

Urutan ANSI untuk memilih ini, menggunakan nomor di sudut kiri bawah, dimulai 38;5;untuk latar depan dan 48;5;latar belakang, kemudian nomor warna, jadi mis:

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

Memberi saya oranye terang pada cokelat (artinya, bagan warna kira-kira kira-kira).

Anda dapat melihat warna pada bagan 1 ini seperti yang akan muncul di terminal Anda dengan cukup mudah:

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

Outputnya cukup jelas.

Beberapa sistem mengatur variabel $ TERM ke xterm-256colorjika Anda berada di terminal 256 warna melalui beberapa kode shell /etc/profile. Pada yang lain, Anda harus dapat mengkonfigurasi terminal Anda untuk menggunakan ini. Itu akan membuat aplikasi TUI tahu ada 256 warna, dan memungkinkan Anda untuk menambahkan sesuatu seperti ini ke ~/.bashrc:

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

Berhati-hatilah bahwa ketika Anda menggunakan urutan pelarian warna di prompt Anda, Anda harus melampirkannya dalam \tanda kurung kotak yang lolos ( diawali), seperti ini:

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

Perhatikan [interior untuk urutan warna tidak lolos, tetapi yang melampirkan. Tujuan dari yang terakhir adalah untuk menunjukkan kepada shell bahwa urutan terlampir tidak dihitung terhadap panjang karakter prompt. Jika hitungan itu salah, hal-hal aneh akan terjadi ketika Anda menggulir kembali ke sepanjang sejarah, misalnya, jika terlalu panjang, panjang kelebihan dari string yang digulir terakhir akan muncul melekat pada prompt Anda dan Anda tidak akan dapat mundur ke itu (itu diabaikan dengan cara yang sama prompt adalah).

Perhatikan juga bahwa jika Anda ingin menyertakan output dari perintah yang dijalankan setiap kali prompt digunakan (bukan hanya sekali ketika prompt diatur), Anda harus mengaturnya sebagai string literal dengan tanda kutip tunggal, misalnya:

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

Meskipun ini bukan contoh yang bagus jika Anda senang menggunakan bash's special \datau \D{format}prompt escape - yang bukan topik pertanyaan tetapi dapat ditemukan di man bashbawah PROMPTING. Ada berbagai pelarian berguna lainnya seperti \wuntuk direktori saat ini, \uuntuk pengguna saat ini, dll.


1. Bagian utama dari bagan ini, warna 16 - 231 (perhatikan bahwa jumlahnya tidak berurutan) adalah kubus warna 6 x 6 x 6 RGB. "Color cube" mengacu pada fakta bahwa ruang warna RGB dapat direpresentasikan menggunakan array tiga dimensi (dengan satu sumbu untuk merah, satu untuk hijau, dan satu untuk biru). Setiap warna dalam kubus di sini dapat direpresentasikan sebagai koordinat dalam array 6 x 6 x 6, dan indeks dalam grafik dihitung sebagai berikut:

    16 + R * 36 + G * 6 + B

Warna pertama dalam kubus, pada indeks 16 dalam bagan, adalah hitam (RGB 0, 0, 0). Anda bisa menggunakan rumus ini dalam skrip shell:

#!/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"
goldilocks
sumber
1
Saya sarankan untuk penanya asli untuk menguji ketersediaan warna dengan grafik uji. Ada satu di sini: robmeerman.co.uk/unix/… atau bisa sangat mudah melakukannya, jika orang tidak mempercayai skrip shell yang ditemukan di internet.
IBr
1
@IBr Poin menarik. Hanya melihat semua warna adalah tugas sederhana, jadi saya beberapa baris bash di atas untuk melakukan ini.
goldilocks
Skrip referensi warna yang ditemukan di sini mungkin lebih bermanfaat, karena ringkas namun masih memiliki kode dan dengan masing-masing warna dipisahkan untuk kejelasan.
Michael Plotke
1
Tolong, jangan gunakan echountuk apa pun selain teks literal yang tidak dimulai dengan tanda hubung ( -). Itu tidak bisa diangkut. Semua implementasi umum melanggar standar yang menyatakan bahwa tidak ada opsi yang harus didukung. Lebih buruk lagi, mereka tidak konsisten. Anda harus menggunakannya printfsebagai gantinya. (Dan jangan menanamkan variabel di dalam pernyataan printf, gunakan %s.)
nyuszika7h
2
colortest-256daftar pallette xterm dalam bentuk ringkas yang bagus. ( apt-get install colortestjika tidak ada)
Volker Siegel
38

Sepertinya setidaknya beberapa daftar adalah:

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

berdasarkan https://wiki.archlinux.org/index.php/Color_Bash_Prompt

Michael Durrant
sumber
2
Terima kasih karena akhirnya memberikan string yang sebenarnya bisa digunakan.
lbutlr
21

Saya menulis fungsi bash yang dapat menampilkan semua warna, jika ini membantu.

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
}

Anda dapat membuangnya di .bashrc / .bash_profile / .bash_aliases atau simpan sebagai skrip dan jalankan dengan cara itu. Anda dapat menggunakan warna untuk mengubah warna seperti yang saya lakukan dengan nama saya di bawah ini.

keluaran colorgrid (): Output dari colorgrid ()

Saya mengubah nama saya di .bash_profile saya dengan melakukan ini:

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 "

Perhatikan bahwa awalan 01 dalam string seperti \[\033[01;38;5;214m\]a menyetelnya menjadi tebal.

Plasmarob
sumber
3
Saya sangat senang saya membagikan ini. berguna hari ini memperbaiki bashrc dan pengaturan terminal menjadi kurang mengerikan. Baru saja melihat tanggalnya - besok 2 tahun yang lalu.
Plasmarob
12

Skrip lain seperti yang diposting oleh TAFKA 'goldilocks' untuk menampilkan warna yang mungkin sedikit lebih praktis untuk tujuan referensi:

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

Ini harus berukuran dengan benar untuk terminal yang Anda gunakan. Ini sedikit berlebihan untuk tujuan ini, tetapi sekarang Anda dapat mengontrol banyak aspek bagaimana ini ditampilkan melalui parameter. Semoga semuanya cukup jelas.

Krowe
sumber
1
Tidak membunuh seperti berlebihan :)
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\]
Ashish Rana
sumber