Какие цветовые коды я могу использовать в своей подсказке PS1?

Rsync создает временный названный файл .filename.$$$$ Если Ваш друг хочет загрузить при загрузке, они должны загрузить этот файл с помощью -P расширение, как, после того как Вы закончили, файл, исчезнет, и ему, вероятно, придется возобновить загрузку с помощью корректного имени файла

Я просто протестировал это с rsync, и можно загрузить тот временный файл при загрузке его. Немного грязный, но это работает!

136
13.04.2017, 15:37
7 ответов

Это ANSI escape sequences; эта ссылка представляет собой диаграмму цветовых кодов, но есть и другие интересные вещи на этой странице Википедии. Не все из них работают (например) на обычной консоли Linux.

Это неправильно:

\033]00m\]. # white

0 сбрасывает терминал на его значение по умолчанию (которое, вероятно, белое). Реальный код для белого переднего плана - 37. Также, экранированная закрывающаяся скобка в конце (\]) не является частью последовательности цветов (см. несколько последних параграфов ниже для объяснения их назначения при установке подсказки).

Обратите внимание, что некоторые 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 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

Остерегайтесь, что когда вы используете цветовые экранирующие последовательности в подсказке, вы должны заключить их в экранированные (\ префиксные) квадратные скобки, как это:

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

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

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

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

Хотя это не лучший пример, если вы довольны использованием специальных \d или \D{формата} escapes -- которые не являются темой вопроса, но могут быть найдены в man bash в разделе PROMPTING. Существуют различные другие полезные эквапсы, такие как \w для текущей директории, \u для текущего пользователя и т.д.


1. Основная часть этой диаграммы, цвета 16 - 231 (обратите внимание, что они не в числовом порядке) - это цветовой куб 6 x 6 x 6 RGB. Под "цветовым кубом" понимается тот факт, что цветовое пространство RGB может быть представлено с помощью трехмерного массива (с одной осью для красного, с одной - для зеленого и с одной - для синего). Каждый цвет в кубе здесь может быть представлен в виде координат в массиве 6 х 6 х 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"
184
27.01.2020, 19:29
[112328] Другой скрипт, подобный скрипту TAFKA 'goldilocks' для отображения цветов, который, возможно, немного более практичен для справочных целей:

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

12
27.01.2020, 19:29

Похоже, по крайней мере, что часть списка:

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

40
27.01.2020, 19:29
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\]
-1
27.01.2020, 19:29

Я написал функцию 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() выводит: Output of 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 выделяет ее жирным шрифтом.

37
20.08.2021, 12:53
cat "$0" 1>&2;
#
# = 256-color test =
#
# [
# |*| Source: https://unix.stackexchange.com/a/643715
# |*| Source (original): https://misc.flogisoft.com/bash/tip_colors_and_formatting#colors2
# |*| Last update: CE 2021-05-15 03:17 UTC ]
#
#
# This script shall echo a bunch of color codes generating a fancy color table: demonstrating the 256-color compatibility of the shell / terminal.
#
#
#
#
# == Implementation ==
#

# === Table 0..15 ===

    Colors="$(
# Colors (0..15):
    i=0;

    while
    echo "$i";
    [ $i -lt 15 ];

    do
    i=$(( $i + 1 ));

    done;
    )";


    echo;

    for x0 in \
    '48' '38'; # Background / Foreground

    do {
    for Color in \
    $Colors;

    do {
    printf '\e['"$x0"';5;%sm  %3s  ' \
    "$Color" "$Color"; # [Note 1]

# 8 entries per line:
    [ $(( ($Color + 1) % 8 )) -eq 0 ] && echo -e '\e[m'; # [Note 1]
    };

    done;
    };

    done;

    unset Colors x0;
    echo;


# === Table 16..255 ===

    for Color in \
    $(
# Colors (16..255):
    i=16;

    while
    echo "$i";
    [ $i -lt 255 ];

    do
    i=$(( $i + 1 ));

    done;
    );


    do {
    Colors="$Colors $Color";

# 6 entries per group:
    [ $(( ($Color + 1) % 6 )) -eq 4 ] && {
    for x0 in \
    '38' '48'; # Foreground / Background

    do {
    for Color in \
    $Colors;

    do
    printf '\e['"$x0"';5;%sm  %3s  ' \
    "$Color" "$Color"; # [Note 1]

    done;

    echo -ne '\e[m'; # [Note 1]
    };

    done;

    unset Colors x0;
    echo;
    };

    };


    done;

    unset Color;
    echo;
#
#
#
#
# == Notes ==
#
# [Note 1]
# [
# For explanation on the color code:
# |*| Coloring test utility: https://unix.stackexchange.com/a/643536 ]
#
cat "$0" 1>&2;
#
# = 256-color test (old) =
#
# [
# |*| Source: https://unix.stackexchange.com/a/643715
# |*| Source (original): https://misc.flogisoft.com/bash/tip_colors_and_formatting#colors2
# |*| Last update: CE 2021-05-15 03:17 UTC ]
#
#
# Basically a replicate of the original with no logic change. Left there mostly for reference.
#
#
#
#
# == Implementation ==
#
# Colors (0..255):
    Colors="$(
    i=0;

    while
    echo "$i";
    [ $i -lt 255 ];

    do
    i=$(( $i + 1 ));

    done;
    )";


    echo;

    for x0 in \
    '38' '48'; # Foreground / Background

    do {
    for Color in \
    $Colors;

    do {
    printf '\e['"$x0"';5;%sm  %3s  ' \
    "$Color" "$Color";

# 6 entries per line:
    [ $(( ($Color + 1) % 6 )) -eq 4 ] && echo -e '\e[m';
    };

    done;

    echo;
    };

    done;

    unset Colors x0 Color;
0
20.08.2021, 12:53

Вы можете использовать ответы @goldilocks и @Michael Durrant, чтобы создать что-то более читабельное, подобное этому:

CYAN="\[\e[01;36m\]"
WHITE="\[\e[01;37m\]"
BLUE="\[\e[01;34m\]"
TEXT_RESET="\[\e[00m\]"   
TIME="\t"
CURRENT_PATH="\W"
ROOT_OR_NOT="\$"

export PS1="${CYAN}[${BLUE}${TIME}${WHITE} ${CURRENT_PATH}${CYAN}]${ROOT_OR_NOT}${TEXT_RESET} "

Что приведет к:

preview

1
20.08.2021, 12:53

Теги

Похожие вопросы