Проверка количества цветов, поддерживаемых моим эмулятором терминала

21

Есть ли надежный способ проверить, сколько цветов поддерживает мой эмулятор терминала?

Если echo $TERMпечатает xterm, это однозначно говорит мне, сколько цветов поддерживает мой эмулятор терминала? Как я могу проверить эту информацию надежно?

Амелио Васкес-Рейна
источник
4
См. Также: unix.stackexchange.com/questions/9957/…
jasonwryan

Ответы:

20

Значение $TERMне дает много информации о количестве поддерживаемых цветов. Многие терминалы объявляют себя как xtermи могут поддерживать любое количество цветов (2, 8, 16, 88 и 256 являются общими значениями).

Вы можете запросить значение каждого цвета с помощью OSC 4 ; c ; ? BEL последовательности управления . Если номер цвета cподдерживается, и если терминал понимает эту последовательность управления, терминал ответит значением цвета. Если номер цвета не поддерживается или терминал не понимает эту последовательность управления, терминал ничего не отвечает. Вот фрагмент кода bash / zsh, чтобы узнать, поддерживается ли цвет 42 (перенаправить в / из терминала при необходимости):

printf '\e]4;%d;?\a' 42
if read -d $'\a' -s -t 1; then … # color 42 is supported

Среди популярных терминалов xterm и терминалы на основе библиотеки VTE (Gnome-терминал, Terminator, Xfce4-терминал,…) поддерживают эту последовательность управления; rxvt, konsole, screen и tmux нет.

Я не знаю более прямого пути.

Жиль "ТАК - перестань быть злым"
источник
Спасибо, Жиль. Это выглядит великолепно. Могу ли я спросить, что read -d $'\a' -s -t 1делает?
Амелио Васкес-Рейна
1
@intrpc Чтение ввода до первого \a(символ колокольчика) без повторяющегося ввода с таймаутом в 1 секунду.
Жиль "ТАК - перестань быть злым"
5
@ l0b0 tput colorsзапрашивает базу данных terminfo. Скорее всего, у вас есть TERM=xterm. Xterm может поддерживать как минимум 2, 8, 16, 88 или 256 цветов в зависимости от версии и параметров компиляции и времени выполнения, но база данных terminfo может хранить только одно значение. Вы можете установить, например TERM=xterm+256color, но тогда вы будете раздражены, когда войдете на компьютер, у которого нет этой записи в его базе данных termcap / terminfo.
Жиль "ТАК - перестань быть злым"
2
@ l0b0 Ваша труба, очевидно, не имеет никакого отношения к терминалу. Вам нужно распечатать на терминал ( printf … >/dev/tty), а затем прочитать с терминала ( read … </dev/tty). Xterm реагирует на OSC 4; …; ? BELпоследовательность, вводя нажатия клавиш.
Жиль "ТАК - перестань быть злым"
9

Вы можете использовать

$ tput colors

На моем Debian установка tput является частью ncurses-binпакета, который установлен по умолчанию.

Виктор Клос
источник
6
Это будет только информировать о том, сколько цветов ваш терминал сообщает окружающей среде TERM, а не сколько цветов он может реально поддерживать при наличии соответствующегоTERM
MestreLion