터미널이 24비트/트루 컬러를 지원하는지 확인하세요.

터미널이 24비트/트루 컬러를 지원하는지 확인하세요.

쉘 스크립트에서 터미널이 24비트 또는 트루 컬러를 지원하는지 프로그래밍 방식으로 테스트하려면 어떻게 해야 합니까?


관련된:이 문제안구 검증을 위한 24비트/트루 컬러 테스트 패턴을 인쇄하는 것입니다.

답변1

이 소스또는 $COLORTERM포함되어 있는지 확인하십시오 .24bittruecolor

sh

[ "$COLORTERM" = truecolor ] || [ "$COLORTERM" = 24bit ]

bash/ zsh:

[[ $COLORTERM =~ ^(truecolor|24bit)$ ]]

답변2

그냥 사용하세요 tput colors. 테스트를 믿습니다.터미널 기능$TERM구문 분석이나 자신보다 안전한 테스트입니다 $COLORTERM.

if (( $(tput colors 2>/dev/null) > 256 )); then
    echo "What a beautiful rainbow!!!"
else
    echo "Back to the 80's VGA era anyone?"
fi

물론 tput출력만 가능광고하는에 등록된 기능용어 정보 데이터베이스이므로 귀하의 정보가 정확하게 반영되지 않을 수 있습니다.실제터미널 기능.

불행하게도 리뷰에 따르면, 특히 Windows 및 MacOS와 같은 플랫폼에서는 많은 터미널에 여전히 부정확하거나 오래된 정보가 있습니다. 충분한 시간이 주어지면(그리고 버그 보고서도!) 결국 이러한 터미널이 $TERM제대로 설정될 수 있기를 바랍니다. 결국 Terminfo 데이터베이스는 4년 동안 24비트 색상을 지원해 왔습니다.

답변3

내 프로그램에서 이 C++ 솔루션을 제거했습니다.

먼저, 한 번에 한 문자씩 읽을 수 있도록 termios를 설정하십시오.

#include <termios.h>

  struct termios tio, tio_init;
  tcgetattr(0, &tio_init);         // Keep a copy so you can reset later
  tcgetattr(0, &tio);    
  tio.c_iflag &= ~(IXON | IXOFF);  // Pass Ctrl-S and Ctrl-Q
  tio.c_lflag &= ~(ECHO | ICANON); 
  tio.c_cc[VSUSP] = 0;             // Pass Ctrl-Z (confuses terminal)
  tio.c_cc[VMIN] = 0; 
  tio.c_cc[VTIME] = 1;
  tcsetattr(0, TCSANOW, &tio);

다음은 ANSI 쿼리를 제출하고 응답에서 문자를 추출하는 간단한 루틴입니다. 우리는 터미널 프로그램이 빠르며 1틱(0.1초)의 용어 문자 시간 초과가 응답 문자 표시가 중단되는 시기를 알려준다고 가정합니다. 터미널 프로그램이 명령을 실행할 수 있도록 '\n'을 종료해야 하는 경우도 있습니다. 다시 그려야 한다고 결정할 때까지 계속 대기할 수 있습니다.

void AnsiViewQuery(char *reply, const char *query, int size) {
  printf("%s\n", query);
  int len = 0;
  while (len < size-1) {
    if (read(0, reply+len, 1) == 1) ++len;
    else break;
  }
  reply[len] = '\0';
}

전경색을 1;2;3으로 설정하고 다시 읽을 수 있는지 확인합니다...

  char reply[32];
  printf("\e[38;2;1;2;3m");
  AnsiViewQuery(reply, "\eP$qm\e\\", 32);
  int truecolor = strncmp("\eP1$r0;38:2::1:2:3m", reply, 19) ? 0 : 1;

이것은 절대 안전하지 않습니다. 24비트 색상을 설정하고 싶지만 다시 읽을 필요는 없습니다. 쓰기와 읽기가 모두 효과적이면 시험에 합격한 것입니다. 일부 터미널(예: Gnome 터미널)은 하나만 지원하고 다른 터미널은 지원하지 않습니다. 트루 컬러가 지원된다고 생각한다면 그게 맞을 것입니다. 아마도 이것을 개선할 수 있을 것입니다.

동일한 프로그램은 유니코드 문자를 출력하고 커서가 한 문자 이동했는지 확인하여 특정 유니코드 세트가 지원되는지 확인합니다.

관련 정보