풋 세 타프 컬러 테이블? 색상 코드를 결정하는 방법?


79

터미널을 색칠하는 중 PS1입니다.

tput;를 사용하여 색상 변수를 설정하고 있습니다 . 예를 들어, 여기 보라색이 있습니다 :

PURPLE=$(tput setaf 125)

질문:

125다른 색상 의 색상 코드 (예 :)는 어떻게 찾 습니까?

컬러 테이블 가이드 / 치트 시트가 있습니까?

나는 무엇인지 잘 모르겠습니다 125... 16 진수 색상 setaf을 사용하여 사용할 수 있는 숫자로 변환하는 방법이 있습니까?


답변:


152

입력 할 수있는 색상 수는로 표시됩니다 tput colors.

기본 8 색을 보려면 ( setfurxvt 터미널 및 setafxterm 터미널에서 사용) :

$ printf '\e[%sm▒' {30..37} 0; echo           ### foreground
$ printf '\e[%sm ' {40..47} 0; echo           ### background

일반적으로 다음과 같이 이름이 지정됩니다.

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
magenta   COLOR_MAGENTA     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

확장 된 256 색을 보려면 ( setafurxvt에서 사용 ) :

$ printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'

숫자와 정렬 된 출력을 원할 경우 :

#!/bin/bash
color(){
    for c; do
        printf '\e[48;5;%dm%03d' $c $c
    done
    printf '\e[0m \n'
}

IFS=$' \t\n'
color {0..15}
for ((i=0;i<6;i++)); do
    color $(seq $((i*36+16)) $((i*36+51)))
done
color {232..255}

색인으로 레이블이 지정된 256 색 차트


1600 만 색상에는 약간의 코드가 필요합니다 (일부 콘솔에서는이를 표시 할 수 없음).
기본 사항은 다음과 같습니다.

fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"

fb이다 front/back3/4.

너무 많은 색상을 표시하는 콘솔 용량에 대한 간단한 테스트는 다음과 같습니다.

for r in {200..255..5}; do fb=4;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm   ' "$fb" "$r" "$g" "$b"; done; echo

빨간색 선, 어두운 곳에서 밝은 곳으로 페이딩 됨 (왼쪽에서 오른쪽으로) 왼쪽에서 오른쪽으로 매우 작은 톤 변화가있는 빨간색 선이 나타납니다. 작은 변화가 보이는 경우, 콘솔은 1600 만 색상을 사용할 수 있습니다.

각각 rg, 및 b은 RGB (빨강, 녹색, 파랑)의 경우 0에서 255 사이의 값입니다.

콘솔 유형이이를 지원하면이 코드는 색상 표를 만듭니다.

mode2header(){
    #### For 16 Million colors use \e[0;38;2;R;G;Bm each RGB is {0..255}
    printf '\e[mR\n' # reset the colors.
    printf '\n\e[m%59s\n' "Some samples of colors for r;g;b. Each one may be 000..255"
    printf '\e[m%59s\n'   "for the ansi option: \e[0;38;2;r;g;bm or \e[0;48;2;r;g;bm :"
}
mode2colors(){
    # foreground or background (only 3 or 4 are accepted)
    local fb="$1"
    [[ $fb != 3 ]] && fb=4
    local samples=(0 63 127 191 255)
    for         r in "${samples[@]}"; do
        for     g in "${samples[@]}"; do
            for b in "${samples[@]}"; do
                printf '\e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
            done; printf '\e[m\n'
        done; printf '\e[m'
    done; printf '\e[mReset\n'
}
mode2header
mode2colors 3
mode2colors 4

레이블로 인덱스가있는 샘플 전경색 차트

레이블로 인덱스가있는 샘플 배경색 차트

16 진수 색상 값을 (가장 가까운) 0-255 색상 인덱스로 변환하려면

fromhex(){
    hex=${1#"#"}
    r=$(printf '0x%0.2s' "$hex")
    g=$(printf '0x%0.2s' ${hex#??})
    b=$(printf '0x%0.2s' ${hex#????})
    printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 + 
                       (g<75?0:(g-35)/40)*6   +
                       (b<75?0:(b-35)/40)     + 16 ))"
}

다음과 같이 사용하십시오.

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

에서 사용되는 색상 번호를 찾으려면 HTML 색상 포맷 :

#!/bin/dash
tohex(){
    dec=$(($1%256))   ### input must be a number in range 0-255.
    if [ "$dec" -lt "16" ]; then
        bas=$(( dec%16 ))
        mul=128
        [ "$bas" -eq "7" ] && mul=192
        [ "$bas" -eq "8" ] && bas=7
        [ "$bas" -gt "8" ] && mul=255
        a="$((  (bas&1)    *mul ))"
        b="$(( ((bas&2)>>1)*mul ))" 
        c="$(( ((bas&4)>>2)*mul ))"
        printf 'dec= %3s basic= #%02x%02x%02x\n' "$dec" "$a" "$b" "$c"
    elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; then
        b=$(( (dec-16)%6  )); b=$(( b==0?0: b*40 + 55 ))
        g=$(( (dec-16)/6%6)); g=$(( g==0?0: g*40 + 55 ))
        r=$(( (dec-16)/36 )); r=$(( r==0?0: r*40 + 55 ))
        printf 'dec= %3s color= #%02x%02x%02x\n' "$dec" "$r" "$g" "$b"
    else
        gray=$(( (dec-232)*10+8 ))
        printf 'dec= %3s  gray= #%02x%02x%02x\n' "$dec" "$gray" "$gray" "$gray"
    fi
}

for i in $(seq 0 255); do
    tohex ${i}
done

다음과 같이 사용하십시오 ( "기본"은 처음 16 색, "색"은 주요 그룹, "회색"은 마지막 회색 색상).

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626

Fromhex 기능이 훌륭합니다! 정말 고마워!
mhulse

로빈 ' fromhex. 다시 감사합니다! 또한 에 대한 확인을 추가했습니다# . 피드백?
mhulse

1
예, 선행 '#'을 제거하는 것이 합리적인 보호입니다. 사용하기가 훨씬 간단합니다 hex=${1#"#"}. 이 없으면 아무것도 제거 $1하지 않고 #존재하는 경우 제거합니다. 업데이트 된 코드를 참조하십시오.

좋은! 훨씬 더 컴팩트합니다. 내 코드를 지금 업데이트 중입니다. 감사합니다!!!!
mhulse

적어도 xterm 버전에서는 \e[0;%s8;2;%s;%s;%sm16M 색상을 제공하지 않으며 요청 된 RGB에 가장 가까운 240 색상 팔레트의 색상 만 제공합니다.
Stéphane Chazelas

14

짧은 대답은 웹 색상 표를 찾아 색상 번호와 일치시킬 수 있다는 것입니다.

정답은 올바른 매핑이 터미널에 따라 다르다는 것입니다.

125라고도 이스케이프 시퀀스 파라미터이다 setaf단말 설명한다. tput숫자에 특별한 의미를 부여하지 않습니다. 실제로 특정 터미널 에뮬레이터에 따라 다릅니다.

얼마 전, ANSI는 8 가지 색상에 대한 코드를 정의했으며 그 번호를 매기는 두 가지 체계가있었습니다. 두 개는 일부 터미널 설명에서 쌍 setf/setb또는로 표시 setaf/setab됩니다. 후자는 "ANSI 색상"이라는 의미를 가지므로 더 자주 사용되는 것을 볼 수 있습니다. 전자 (setf / setb)는 ncurses FAQ에 명시된대로 빨강 / 파랑의 순서를 바꿨습니다. 왜 빨강 / 파랑이 바뀌 었 습니까? 그러나 두 경우 모두 색을 번호 매기기위한 체계가 확립되었습니다. 해당 숫자와 RGB 컨텐츠 사이에는 사전 정의 된 관계가 없습니다.

특정 터미널 에뮬레이터의 경우 쉽게 열거 할 수있는 사전 정의 된 색상 팔레트가 있으며 이러한 이스케이프 시퀀스를 사용하여 프로그래밍 할 수 있습니다. 관련 표준 이 없으며 xterm FAQ에서 언급 한 것처럼 파란색 음영이 마음에 들지 않는 터미널 에뮬레이터간에 차이점이 있습니다 .

그러나 컨벤션은 종종 표준과 혼동됩니다. 지난 20 년 동안 xterm을 개발하면서 ANSI (8) 색상을 통합하고 aixterm기능 (16) 색상을 조정했으며 88 색 및 256 색에 대한 확장을 추가했습니다. 그 중 많은 부분이 다른 개발자가 다른 터미널 에뮬레이터를 위해 채택했습니다. 이것은 xterm FAQ에 요약되어 있습니다. "xterm"을 "xterm-256color"와 동일하게 만들면 어떻습니까? .

xterm 소스 코드에는 색상을 시연하기위한 스크립트 (예 : 동일한 이스케이프 시퀀스 tput사용)가 포함되어 있습니다.

이 질문 / 답변도 도움이 될 수 있습니다. Ansi 확장 색상 색인에서 색상의 RGB 값 (17-255)


도와 주셔서 감사합니다 토마스, 정말 고마워요! iTerm을 실행하는 Mac / OS X에 있습니다. 귀하의 설명은 내 설정에 대해 더 잘 이해하는 데 실제로 도움이됩니다 (웹에서 다양한 다른 사람들의 프롬프트 색상에서 많은 복사 / 붙여 넣기를 수행했습니다). 시간을내어 상세하고 유익한 답변을 보내 주셔서 감사합니다. :)
mhulse

9

tput유틸리티 는 256 색 조회 테이블을 사용하여 터미널 기능 을 사용하는 8 비트 ANSI 이스케이프 시퀀스 ( Esc및로 시작 [) 를 인쇄 하므로 이러한 제어 시퀀스를 색상으로 해석 할 수 있습니다. 그래픽 카드에서 일반적으로 사용되는 사전 정의 된 256 색 세트입니다.

터미널에서 256 색을 모두 인쇄하려면 다음 단일 라이너를 사용해보십시오.

for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done

힌트 : | column열리스트에 추가 합니다.

이 256 색 룩업 테이블은 Wikipedia 페이지 에서 다음과 같이 찾을 수도 있습니다 .

차트;  ANSI 이스케이프 코드;  Wikipedia의 8 비트 256 색 룩업 테이블;  256 색 모드-전경 : ESC [38; 5; #m 배경 : ESC [48; 5; #m


3

zsh을 함께하고에 xterm-like 터미널 ( xtermvte같은 기반 터미널 gnome-terminal, xfce4-terminal... 적어도), 당신은 할 수 있습니다 :

$ read -s -t1 -d $'\a' $'c?\e]4;125;?\a' && echo "${c##*;}"
rgb:afaf/0000/5f5f

bash는 다음과 같습니다.

read -s -t1 -d $'\a' -p $'\e]4;125;?\a' c && echo "${c##*;}"

( 종료 규칙 echo이 터미널 규칙 이 비활성화 된 전송 될 색상을 쿼리하도록하려면 -s) 그렇지 않으면 응답이 시간의 절반에 해당하는 규칙으로 표시되므로 read프롬프트의 일부로 전송 ( var?promptzsh에서) ksh에서와 마찬가지로 -p promptbash에서)).

색상 125의 정의를 얻으려면 (여기서는 RGB 사양으로, 각 숫자는 0에서 FFFF 사이의 16 진수로 빨강, 녹색 및 파랑 구성 요소의 강도입니다).

다음 xtermcontrol명령 을 사용하여 처음 16 색에 대해 동일한 작업을 수행 할 수 있습니다 .

$ xtermcontrol --get-color1
rgb:cdcd/0000/0000

굉장히 도와 주셔서 감사합니다! +1
mhulse

@Gilles, 터미널 징계 에코가 비활성화 된 후 프롬프트를 통해 쿼리를 보내려고합니다. 편집을 참조하십시오.
Stéphane Chazelas

@ StéphaneChazelas 다른 터미널 프로그램 (gnome-terminal) (xterm 터미널)을 사용하여 코드가 올바르게 작동합니다 (bash 및 zsh 모두) 이상하게도 : 터미널이 256 색을 표시 할 수있는 경우 tput colors에만보고 8합니다. 또한 xterm-color (Konsole) 는 해당 터미널이 1600 만 색상 (물론 256 색상)을 모두 표현할 수있는 경우에도 tput colors보고합니다 8. 그리고 아니, "색상":-) (즉, 변경) 결과 (나는 그 세부 사항을 알고 있었다) tmux 또는 화면이 없습니다. 간단히 말해 : 일부 터미널 / 콘솔에서 코드가 실패 할 수 있습니다.

아, tohex가 내 대답에 덧붙였다. 내가 기대했던 것보다 조금 더 길지만 256 색은 꽤 변덕스러워 보인다.

0

콘솔 용어의 ANSI 색상

느릅 나무 기간 프로토콜 콘솔 사용을 따라 순서가 될 수 있습니다 : \e[38;5;XXXm또는 \e[3XXXm경우는 XXXANSI 번호에 해당합니다.

올바른 ANSI 시퀀스를 사용하려면을 사용해야 tput합니다.

Wikipedia의 ANSI 이스케이프 코드 와 관련하여 다음과 같이 썼습니다.

#!/bin/bash


for ((i=0; i<256; i++)) ;do
    echo -n '  '
    tput setab $i
    tput setaf $(( ( (i>231&&i<244 ) || ( (i<17)&& (i%8<2)) ||
        (i>16&&i<232)&& ((i-16)%6 <(i<100?3:2) ) && ((i-16)%36<15) )?7:16))
    printf " C %03d " $i
    tput op
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

다음과 같이 렌더링 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

... 그런 다음 작은 스크립트에서 200 개가 넘는 포크를 실행하지 않기 때문에 다음과 같이 썼습니다.

#!/bin/bash

# Connector fifos directory
read TMPDIR < <(mktemp -d /dev/shm/bc_shell_XXXXXXX)

fd=3
# find next free fd
nextFd() { while [ -e /dev/fd/$fd ];do ((fd++)) ;done;printf -v $1 %d $fd;}

tputConnector() {
    mkfifo $TMPDIR/tput
    nextFd TPUTIN
    eval "exec $TPUTIN> >(LANG=C exec stdbuf -o0 tput -S - >$TMPDIR/tput 2>&1)"
    nextFd TPUTOUT
    eval "exec $TPUTOUT<$TMPDIR/tput"
}
myTput() { echo -e "$1\ncr" 1>&$TPUTIN && IFS= read -r -d $'\r' -u $TPUTOUT $2
}
tputConnector

myTput op op
myTput "setaf 7" grey
myTput "setaf 16" black
fore=("$black" "$grey")
for ((i=0; i<256; i++)) ;do
    myTput "setab $i" bgr
    printf "  %s%s  %3d  %s" "$bgr" "${fore[ i>231 && i<244||(i<17)&& (i%8<2)||
        (i>16&&i<232)&&((i-16)%6*11+(i-16)/6%6*14+(i-16)/36*10)<58
        ? 1 : 0 ]}" $i "$op"
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

단 하나의 포크로! 같은 결과이지만 훨씬 빠릅니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.