추가 읽기

추가 읽기

다음 코드가 있습니다.

bold=''
reset=$(echo -en '\033[0m')
black=$(echo -en '\e[1;30m')
magenta=$(echo -en '\033[00;35m')
blue=$(echo -en '\e[1;34m')
cyan=$(echo -en '\e[1;36m')
green=$(echo -en '\e[1;32m')
orange=$(echo -en '\e[1;33m')
purple=$(echo -en '\e[1;35m')
red=$(echo -en '\e[1;31m')
white=$(echo -en '\e[1;37m')
yellow=$(echo -en '\e[1;33m')
lime_yellow=$(echo -en '\e[1;33m')
power_blue=$(echo -en '\e[1;34m')
blink=$(echo -en '\e[1;31m')
reverse=$(echo -en '\e[1;31m')
underline=$(echo -en '\e[1;31m')

if [ -x /usr/bin/tput ] && tput setaf 1 &>/dev/null; then
    echo "tput color is supported."
    tput sgr0 # Reset colors
    bold=$(tput bold)
    reset=$(tput sgr0)
    black=$(tput setaf 0)
    magenta=$(tput setaf 5)
    blue=$(tput setaf 33)
    cyan=$(tput setaf 37)
    green=$(tput setaf 64)
    orange=$(tput setaf 166)
    purple=$(tput setaf 125)
    red=$(tput setaf 124)
    white=$(tput setaf 15)
    yellow=$(tput setaf 136)
    lime_yellow=$(tput setaf 190)
    power_blue=$(tput setaf 153)
    blink=$(tput blink)
    reverse=$(tput smso)
    underline=$(tput smul)
else
    echo "tput color is not supported. Use old school colors."
fi

echo ${red}RED${green}GREEN${yellow}YELLOW${blue}BLUE${purple}PURPLE${cyan}CYAN${white}WHITE${reset}

tput기본적으로 생성된 색상 또는 구식 이스케이프 문자의 두 가지 유형이 있습니다 \e[1;32m. 예를 들어 tput깜박임 및 밑줄을 지원하는 유형이 더 흥미롭기 때문에 코드는 tput가능하면 유형 색상을 사용합니다. 다음은 Oracle Linux 7.6(RedHat 또는 CentOS와 유사) GUI 환경에서 예상대로 작동함을 보여주는 이미지입니다.

여기에 이미지 설명을 입력하세요.

다른 터미널에서 실행하면 작동하지 않습니다. 예를 들어, 아래는 MobaXterm에서 실행되는 스냅샷입니다.

여기에 이미지 설명을 입력하세요.

저도 시도해봤는데 putty역시 안되네요. 내 코드에 문제가 있나요?


고쳐 쓰다

각 터미널에서 실행 해본 echo $TERM결과는 아래와 같습니다.

데스크탑 환경의 Oracle Linux(컬러 작업)
출력: xterm-256color

Windows의 MobaXterm(색상이 작동하지 않음)
출력:xterm

Windows의 Putty(색상이 작동하지 않음)
출력:xterm

답변1

터미널 유형을 다음과 같이 구성해야 합니다.putty,putty-256color, 또는putty-scoPuTTY 또는 이를 기반으로 하는 소프트웨어(예: MobaXTerm)를 사용하는 경우. terminfo 데이터베이스의 유일한 항목인 터미널 유형PuTTY를 올바르게 설명하세요..

이는 널리 퍼진잘못된터미널 에뮬레이터는 모두 XTerm과 호환되며 terminfo 데이터베이스의 및 항목이 xterm이를 올바르게 설명한다고 가정합니다.xterm-256color

이 잘못된 생각Thomas Dickey의 XTerm FAQ에서 언급됨xtermxterm-256color항목이 다른 터미널 에뮬레이터는 물론 XTerm의 모든 버전을 설명하지도 않는다는 점은 주목할 가치가 있습니다 .

terminfo 데이터베이스의 항목은 putty8개의 ECMA-48 색상만 지원하는 터미널을 설명합니다. 사실 xterm엔트리도 ​​마찬가지다. 하지만 그냥 전환 xterm하면xterm-256colour 틀렸다. PuTTY는 XTerm과 다릅니다.

실제로 PuTTY는 ISO/IEC 8613 제어 시퀀스를 사용하여 색상(팔레트의 256개 색상)을 색인화하는 기능이 매우 뛰어납니다. 실제로 2017년부터 꽤 능력이 생겼습니다.직접ISO/IEC 8613 제어 시퀀스 색상(24비트 RGB 색상)을 사용합니다. 이 putty-256colour항목은 전자를 설명합니다. terminfo는 후자를 완전히 설명할 방법이 없습니다.

사용옳은터미널 유형을 tput검색하고옳은제어 순서.

추가 읽기

답변2

다음 코드는 작동합니다.

    magenta=$(tput setaf 5)
    blue=$(tput setaf 4)
    cyan=$(tput setaf 6)
    green="$(tput setaf 2)"
    purple=$(tput setaf 5)
    red=$(tput setaf 1)
    white=$(tput setaf 7)
    yellow=$(tput setaf 3)

답변3

이는 단말기의 기능으로 8가지 기본 색상 외에는 지원하지 않습니다. 사용 가능한 모든 색상을 테스트하기 위해 이 코드를 찾았습니다(출처:tput setaf 색상 테이블? 색상 코드를 결정하는 방법은 무엇입니까?):

# 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

아래는 제가 테스트한 세 터미널 모두의 출력입니다.

  • Oracle Linux 데스크탑 환경 여기에 이미지 설명을 입력하세요.

  • Windows의 MobaXterm 여기에 이미지 설명을 입력하세요.

  • Windows의 퍼티 여기에 이미지 설명을 입력하세요.

따라서 단말기에서는 8가지 기본 색상 외에는 지원하지 않습니다. 안전성과 휴대성을 위해 8가지 색상만 사용해주세요.

관련 정보