シェルスクリプトで端末が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 ++ソリューションを削除しました。
まず、一度に1文字ずつ読み取れるように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端末など)は1つだけをサポートし、他の端末はサポートしません。真の色がサポートされていると思うなら、それは正しいでしょう。おそらくこれを改善できます。
同じプログラムはUnicode文字を出力し、カーソルが1文字移動したことを確認して、特定のUnicodeセットがサポートされていることを確認します。