터미널에서 색상 설정, 백업 및 복원

터미널에서 색상 설정, 백업 및 복원

나는 사용한다이 앱터미널에서 사용 가능한 모든 색상을 표시합니다. 내가 얻는 것은 다음과 같습니다.

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

  1. 프로그램은 100 미만의 색상을 표시하지 않습니다. 왜? 표시할 수 있는 방법이 있나요?
  2. 일부 #rrggbb 값의 n번째 색상을 변경하는 방법이 있나요? 아니면 이 색상이 미리 정의되어 있나요?
  3. 색상을 변경할 수 있는 경우(질문 2 참조) 이 값을 내보내고 가져올 수 있는 방법이 있습니까?

답변1

지원되는 색상의 수와 전경색과 배경색이 어떻게 변경되는지는 단말기에 따라 다릅니다.

데이터베이스는 terminfo일반적으로 올바른 순서를 찾는 데 도움이 될 수 있습니다.

대부분의 색상 터미널은 전경과 배경을 변경하기 위해 ANSI 색상 이스케이프 시퀀스를 지원합니다.색상 0~7.

그건:

  • 전경색 설정$n:printf "\33[3${n}m"
  • 배경색 설정$n:printf "\33[4${n}m"

일부(드문) 터미널(예: emu)은 이러한 ANSI 색상에 대해 서로 다른 시퀀스를 사용합니다.

일부(드문) 터미널(예: QNX 콘솔)에는 다른 이스케이프 시퀀스와 색상이 있습니다.

일부는 (드물게) 색상 쌍을 사용합니다. 배경과 전경에 대한 색상 쌍을 정의한 다음 이스케이프 시퀀스를 사용하여 사용할 색상 쌍을 선택합니다.

오늘날 xterm과 대부분의 최신 무료 소프트웨어 터미널 에뮬레이터는 기본 8개의 ANSI 색상을 최대 16개(8~15는 ANSI 색상 0~7의 더 밝은 버전)까지 확장하고 일부는 88~256색까지 확장합니다.

일부 터미널은 rxvt8가지 색상만 지원하지만 필요한 경우 더 밝은 색상을 사용합니다.용감한또한 열려있습니다(프론트엔드용). 또는깜박거리다(배경으로). \033[34;1m보다 밝은 파란색을 생성합니다 \033[34m.

색상을 사용하는 가장 이식 가능한 방법은 terminfo 데이터베이스를 사용하는 것입니다.

이는 tput명령을 통해 달성할 수 있습니다. tcsh그리고 zsh내장된 것도 있습니다 echoti.

terminfo 데이터베이스가 정확하고 값이 $TERM사용 중인 터미널을 올바르게 반영한다고 가정합니다.

tput colors

터미널에서 지원하는 색상 수를 알려줍니다.

현재 위에서 언급한 드문 예외를 제외하고는 터미널이 ANSI 색상을 지원한다고 가정할 수 있습니다. ANSI 배경색과 전경색에 대한 terminfo 함수는 setab및 입니다 setaf. 터미널이 8개 이상의 색상을 지원하는 경우에도 이 기능을 사용하여 해당 색상을 쿼리할 수 있습니다.

tput setaf 233

터미널이 256색을 지원하는 경우 색상 233에 대한 올바른 이스케이프 시퀀스가 ​​출력되어야 합니다.

의 경우 xterm출력 setaf색상 \033[30m..\033[37m은 0~7, \033[90m..\033[97m색상은 8~15, \033[38;5;16m..\033[38;5;255m색상은 16~255입니다.

\033[38;5;0m..\033[38;5;15m또한 작동하지만 색상 0~15에 대해 이식성이 뛰어난 것보다 4바이트 더 깁니다.

따라서 터미널에서 지원하는 모든 색상을 테스트하십시오. ANSI 색상이 지원되는 경우:

i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
  tput setaf "$i"; printf %04d "$i"
  i=$((i + 1))
done

다른 색상이 지원되는 경우:

i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
  tput setf "$i"; printf %04d "$i"
  i=$((i + 1))
done

색상 쌍에서 작동하는 경우(예: hpterm-color):

i=0; n=$(tput pairs); while [ "$i" -lt "$n" ]; do
  tput scp "$i"; printf %04d "$i"
  i=$((i + 1))
done

이제 색상이나 색상 쌍을 재정의하려면 터미널마다 다릅니다.

initc이를 수행할 수 있는 터미널에 대해 지정된 색상을 재정의할 수 있는 terminfo 함수가 있습니다 . 그리고 initp쌍을 재정의하십시오.

예를 들어, 색상 1을 밝은 흰색으로 재정의합니다.

 tput initc 1 1000 1000 1000

사용 xterm, 전송 순서: \033]4;1;rgb:FF/FF/FF\033\.

색상 쌍을 사용하여 터미널의 검정색 바탕에 흰색으로 색상 쌍 1을 재정의합니다.

 tput initp 1 1000 1000 1000 0 0 0

답변2

사용하고 있기 때문에 gnome-terminalRGB 값을 변경할 필요가 없습니다. 최근 gnome-terminal(v. 3.12부터) 트루 24비트 색상(1,600만)을 지원합니다. 를 사용하여 설정할 수 있습니다 \e[38;2;R;G;B. 예를 들어

printf '\e[38;2;100;200;200mTest\e[0m\n'

파란색 텍스트가 표시되면 터미널이 24비트 색상을 지원하는 것입니다.


그러나 256가지 색상을 고수하려면 다음 스크립트를 사용하여 모든 가능성을 표시하는 것이 좋습니다. 이 스크립트는 원하는 색상을 쉽게 선택할 수 있도록 블록으로 표시합니다(RGB 구성 요소가 적거나 많음).

#!/bin/bash

trap 'echo "Bye"; exit 1' INT

echo "PALETTE OF 8 COLORS"
for i in {30..37}; do printf "\e[1;${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {90..97}; do printf "\e[${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {30..37}; do printf "\e[${i}mTest%-3u \e[0m" "$i"; done; echo
for i in {30..37}; do printf "\e[2;${i}mTest%-3u \e[0m" "$i"; done; echo -e "\n"

echo "PALETTE OF 256 COLORS"
j=8
for i in {0..255}; do
    [[ $i = 16 ]] && j=6
    [[ $i = 232 ]] && j=24
    printf "\e[38;5;${i}mTest%-3u \e[0m" "$i"
    [[ $(( $(( $i - 15 )) % $j )) = 0 ]] && echo
    [[ $(( $(( $i - 15 )) % $(( $j * 6 )) )) = 0 ]] && echo
done
exit 0

답변3

내가 발견한 대로, 나는 다음과 같은 방법으로 모든 색상을 얻을 수 있습니다.

for i in {0..255} ; do printf "\x1b[38;5;${i}mcolour${i}\n"; done

~/.XresourcesRGB 값은 다음과 같이 변경할 수 있습니다 .

xterm*color4: CornflowerBlue
URxvt*color1  : #ff0000
URxvt*color8  : #888888

그러나 모든 터미널 에뮬레이터가 이 값을 존중하는 것은 아닙니다. URXVT예 혹은 gnome-terminal아니오

답변4

숫자를 3자로 공백으로 채우기 때문에 프로그램에 결함이 있습니다. 예를 들어, " [[48;5; 42m(공백 포함) 인쇄는 작동하지 않지만 ^[[48;5;42m(공백 없이) 인쇄는 작동합니다.

관련 정보