Какие цветовые коды можно использовать в моем приглашении 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
Обратите внимание, что финал \]здесь на самом деле не является частью цветовой последовательности; это служит определенной цели в настройке подсказок (я добавил несколько абзацев в конец моего ответа по этому поводу). «Было бы неплохо, если бы была и более читаемая форма». -> Вырезать и вставить в свой ответ является одним из способов сделать это.
Златовласка

Ответы:

174

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

xterm 256 color chart

Последовательность 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

Помните, что когда вы используете цветовые escape-последовательности в вашем приглашении, вы должны заключить их в экранированные (с \префиксом) квадратные скобки, например:

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

Обратите внимание, что [внутренняя часть последовательности цветов не избежала, а окружающие - нет. Цель последнего состоит в том, чтобы указать оболочке, что вложенная последовательность не учитывается в длине символа подсказки. Если этот счет неправильный, то при прокрутке истории назад будут происходить странные вещи, например, если она слишком длинная, избыточная длина последней прокручиваемой строки будет отображаться в вашем приглашении, и вы не сможете вернуться на это (это игнорируется так же, как приглашение).

Также обратите внимание, что если вы хотите включить вывод команды, запускаемой каждый раз, когда подсказка используется (в отличие от однократного, когда подсказка установлена), вы должны установить ее в виде буквенной строки с одинарными кавычками, например:

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

Хотя это не очень хороший пример, если вы довольны использованием специальных \dили \D{format}быстрых экранирований bash - которые не являются темой вопроса, но их можно найти в 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 Интересный момент. Простой просмотр всех цветов - это просто офигительная задача, поэтому я сделал несколько строк выше.
Златовласка
Найденный здесь эталонный скрипт цветов может быть более полезным, будучи компактным, но при этом все еще содержит коды и каждый цвет разделен для ясности.
Майкл Плотке
1
Пожалуйста, не используйте echoничего кроме буквального текста, который не начинается с тире ( -). Это непереносимо. Все распространенные реализации нарушают стандарт, который гласит, что никакие опции не должны поддерживаться. Хуже того, они противоречивы. Вы должны использовать printfвместо этого. (И не встраивайте переменные в операторы printf, используйте %s.)
nyuszika7h
2
colortest-256перечислите Xterm Pallette в красивой компактной форме. ( 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 устанавливает его жирным шрифтом.

Plasmarob
источник
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

Размер должен соответствовать размеру используемого вами терминала. Для этой цели это немного излишне, но теперь вы можете контролировать многие аспекты того, как это отображается с помощью параметров. Надеюсь, все они говорят сами за себя.

krowe
источник
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\]
Ашиш Рана
источник