Bash PS1 프롬프트에서 어떤 색상 코드를 사용할 수 있습니까?

Bash PS1 프롬프트에서 어떤 색상 코드를 사용할 수 있습니까?

bash 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

사용할 수 있는 색상 코드 목록은 어디에서 찾을 수 있나요?

내가 찾고 있어요Bash 콘솔 색상 색상화그러나 실제 코드 목록에 대한 내 질문에는 대답하지 않습니다.

좀 더 읽기 쉬운 테이블도 있으면 좋을 것 같습니다.

또한보십시오:PS1 프롬프트 표시 시간, 사용자, 호스트, 디렉토리 및 Git 분기를 만드는 방법

답변1

사람들은ANSI 이스케이프 시퀀스;링크는 색상 코드 차트로 연결되지만 해당 Wikipedia 페이지에는 다른 흥미로운 내용이 있습니다. 예를 들어 일반 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 

또한, 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  

출력은 자명합니다.

xterm-256color256색 터미널을 사용하면 일부 시스템이 통과할 수 있으며 /etc/profile, 다른 경우에는 이를 사용하도록 터미널을 구성할 수 있습니다. 이렇게 하면 TUI 응용 프로그램이 256가지 색상이 있음을 인식하고 다음과 같은 색상을 추가할 수 있습니다 ~/.bashrc.

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

프롬프트에서 색상 이스케이프 시퀀스를 사용할 때는 다음 \과 같이 이스케이프 처리된(접두사가 붙은) 대괄호로 묶어야 합니다.

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

[색상 시퀀스의 내부 부분은 이스케이프되지 않지만 외부 색상 시퀀스는 이스케이프됩니다 . 후자의 목적은 포함된 시퀀스가 ​​프롬프트의 문자 길이에 포함되지 않는다는 것을 쉘에 표시하는 것입니다. 해당 개수가 잘못된 경우 기록을 뒤로 스크롤할 때 이상한 일이 발생합니다. 예를 들어 기록이 너무 길면 마지막으로 스크롤한 문자열의 추가 길이가 프롬프트에 추가되어 되돌릴 수 없게 됩니다. out.lattice를 추가합니다(프롬프트처럼 무시됩니다).

또한 프롬프트가 사용될 때마다 실행되는 명령의 출력을 포함하려면(프롬프트가 설정될 때 한 번만 실행되는 것이 아니라) 이를 작은따옴표가 포함된 리터럴 문자열로 설정해야 합니다. 예를 들면 다음과 같습니다.

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

이것은 좋은 예는 아니지만 bash의 특수 \d또는 \D{format}프롬프트 이스케이프를 사용하려는 경우 질문의 주제는 아니지만 man bash아래에서 찾을 수 있습니다 PROMPTING. \w현재 디렉터리, \u현재 사용자 등과 같은 다양한 유용한 이스케이프 문자가 있습니다.


1. 차트의 주요 부분인 색상 16 - 231(번호 순서가 아님)은 6 x 6 x 6 RGB 색상 큐브입니다. "컬러 큐브"란 RGB 색상 공간을 3차원 배열(한 축은 빨간색, 한 축은 녹색, 한 축은 파란색)을 사용하여 표현할 수 있음을 의미합니다. 여기서 큐브의 각 색상은 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"

답변2

목록 중 적어도 일부는 다음과 같습니다.

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

답변3

도움이 된다면 모든 색상을 표시하는 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() 출력: 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 굵게 표시됩니다.

답변4

@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} "

결과는 다음과 같습니다.

시사

관련 정보