Які кольорові коди можна використовувати в моєму підказці 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
Зауважте, що фінал \]тут насправді не є частиною кольорової послідовності; це служить цілі конкретного встановлення підказок (я додав кілька абзаців до кінця своєї відповіді про це). "Було б добре, якби була і більш читабельна форма". -> вирізати n 'вставити у власній відповіді - це один із способів зробити це.
goldilocks

Відповіді:


173

Це послідовності втечі ANSI ; це посилання стосується діаграми кольорових кодів, але є й інші цікаві речі на цій сторінці Вікіпедії. Не всі вони працюють на (наприклад) звичайній консолі Linux.

Це неправильно:

\033]00m\] # white

0скидає термінал за замовчуванням (який, мабуть, білий). Дійсний код переднього плану для білого кольору - 37. Також діаграма, що уникнула, закривається в кінці ( \]), не є частиною кольорової послідовності (див. Останні кілька абзаців нижче для пояснення їх призначення при встановленні підказки).

Зауважте, що деякі термінали графічного інтерфейсу дозволяють задати індивідуальну колірну схему. Це вплине на вихід.

Тут є список, який додає 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 кольоровий GUI-термінал (я думаю, що зараз їх більшість), ви можете застосувати кольори з цієї діаграми:

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\]'

Незважаючи на те, що це не великий приклад , якщо ви щасливі з допомогою BASH в спеціальних \dабо \D{format}-команда - які не є темою питання , але може бути знайдено в man bashUnder PROMPTING. Існують різні інші корисні виходи, такі як \wдля поточного каталогу, \uдля поточного користувача тощо.


1. Основна частина цієї діаграми - кольори 16 - 231 (зауважте, що вони не в числовому порядку) - це кольоровий куб розміром 6 x 6 x 6 RGB. "Колір куба" позначає той факт, що кольоровий простір 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

Колір посилання сценарій знайдений тут може бути більш корисним, будучи компактним і все ж мають коди і з кожним кольором , розділених для ясності.
Майкл Плотке

1
Будь ласка, не використовуйте echoнічого, крім прямого тексту, який не починається з тире ( -). Це нерепортаж. Усі загальні реалізації порушують стандарт, який стверджує, що жодні параметри не повинні підтримуватися. Гірше, вони непослідовні. Ви повинні використовувати printfзамість цього. (І не вставляйте змінні всередину операцій printf, використовуйте %s.)
nyuszika7h

2
colortest-256перелічіть палітру 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

Я написав функцію bash, яка може показати вам всі кольори, якщо це допоможе.

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 () виводи: Вихід кольорової сітки ()

Я змінив своє ім’я у своєму .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 роки тому.
Плазмароб

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
Не вбивайте, як надмірність :)
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\]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.