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

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

나는 보았다 색상 화 배쉬 콘솔 컬러 하지만 실제 코드의 목록에 대한 내 질문에 대답하지 않았다.

더 읽기 쉬운 형식이 있다면 좋을 것입니다.

참조 https://unix.stackexchange.com/a/127800/10043


3
\]여기서 마지막 부분은 실제로 색상 순서의 일부가 아닙니다. 그것은 프롬프트를 구체적으로 설정하는 목적으로 사용됩니다 (이에 대한 답변 끝에 몇 개의 단락을 추가했습니다). "더 읽기 쉬운 형태가 있다면 좋을 것입니다." -> 자신의 대답으로 잘라 내기 '붙여 넣기'를 사용하는 것이 방법입니다.
goldilocks

답변:


174

이것들은 ANSI 이스케이프 시퀀스입니다 . 그 링크는 컬러 코드 차트에 대한 것이지만 그 위키 백과 페이지에도 흥미로운 것들이 있습니다. 그들 모두가 (예를 들어) 일반적인 리눅스 콘솔에서 작동하는 것은 아닙니다.

이것은 올바르지 않습니다 :

\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-256color은 쉘 코드를 통해 256 색 터미널에있는 경우 $ TERM 변수를로 설정합니다 /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 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"

1
테스트 차트를 사용하여 색상 가용성을 테스트 할 수있는 원본 질문자를 제안합니다. 여기에 하나가 있습니다 : robmeerman.co.uk/unix/… 또는 인터넷에서 발견 된 쉘 스크립트를 신뢰하지 않으면 쉽게 수행 할 수 있습니다.
IBr

1
@IBr 재미있는 포인트. 모든 색상을 보는 것만으로도 간단한 작업이므로 위의 몇 가지 bash 행을 사용하십시오.
goldilocks

발견 된 색상 참조 스크립트 여기가 소형 인 그러나 아직도 코드를 가진하고 명확하게 구분되는 색상으로, 더 유용 할 수 있습니다.
Michael Plotke

1
echo대시 ( -)로 시작하지 않는 리터럴 텍스트 이외의 다른 용도로 사용 하지 마십시오 . 휴대 할 수 없습니다. 모든 일반적인 구현 은 옵션을 지원하지 않아야한다는 표준 을 위반합니다 . 더군다나, 일관성이 없습니다. printf대신 사용해야 합니다. (그리고 printf 문에 변수를 포함 시키지 않으 려면을 사용하십시오 %s.)
nyuszika7h 15:08의

2
colortest-256xterm 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 () 출력 : 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 년 전일 것입니다.
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

사용중인 터미널에 맞는 크기 여야합니다. 이 목적을 위해 약간 위에 있지만 이제 매개 변수를 통해 표시되는 방법의 많은 측면을 제어 할 수 있습니다. 바라건대, 그들은 모두 자명하다.


1
overkill :)와 같은 살인은 없습니다
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\]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.