쉘 스크립트에서 터미널이 24비트 또는 트루 컬러를 지원하는지 프로그래밍 방식으로 테스트하려면 어떻게 해야 합니까?
관련된:이 문제안구 검증을 위한 24비트/트루 컬러 테스트 패턴을 인쇄하는 것입니다.
답변1
이 소스또는 $COLORTERM
포함되어 있는지 확인하십시오 .24bit
truecolor
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 터미널)은 하나만 지원하고 다른 터미널은 지원하지 않습니다. 트루 컬러가 지원된다고 생각한다면 그게 맞을 것입니다. 아마도 이것을 개선할 수 있을 것입니다.
동일한 프로그램은 유니코드 문자를 출력하고 커서가 한 문자 이동했는지 확인하여 특정 유니코드 세트가 지원되는지 확인합니다.