
Команда tput
имеет два различных параметра для установки цвета, setf
и setaf
, но оба они, похоже, прекрасно работают на моем компьютере:
$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'
Похоже, что аналогичная двойственность существует и в случае с setb
и setab
.
В чем разница между этими двумя вариантами?
решение1
setf
ограничено только 8 цветами. setaf
можно установить до 256 цветов.
(вся следующая информация будет относиться к urxvt, так как это мой терминал, но информация будет похожа, если не такая же, как и для других терминалов)
Оба setf
и setaf
предоставляют разный код выхода. Вы можете увидеть это в следующем:
# tput setf 2 | xxd
0000000: 1b5b 3332 6d .[32m
# tput setaf 2 | xxd
0000000: 1b5b 3338 3b35 3b32 6d .[38;5;2m
Из моей urxvt(7)
страницы руководства:
"ESC [ Pm m"
Character Attributes (SGR)
...
Pm = 30 / 40 fg/bg Black
Pm = 31 / 41 fg/bg Red
Pm = 32 / 42 fg/bg Green
Pm = 33 / 43 fg/bg Yellow
Pm = 34 / 44 fg/bg Blue
Pm = 35 / 45 fg/bg Magenta
Pm = 36 / 46 fg/bg Cyan
Pm = 37 / 47 fg/bg White
Pm = 38;5 / 48;5 set fg/bg to colour #m (ISO 8613-6)
Таким образом, из вышеприведенного xxd
вывода мы видим, что tput setf 2
использует Pm = 32
, который установит цвет на зеленый. tput setaf 2
с другой стороны использует Pm = 38;5
, который получает представляет цветовой код, определенный в ISO 8613-6 (также зеленый).
В ISO 8613-6 цвета 0x00-0x07 совпадают со стандартными цветами, а 0x08 - 0x0f являются стандартными "жирными" цветами. Как только вы дойдете до 0x10-0xff, вы получите новые цвета.
Украдено извикипедия:
0x00-0x07: standard colors (as in ESC [ 30..37 m)
0x08-0x0f: high intensity colors (as in ESC [ 90..97 m)
0x10-0xe7: 6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
0xe8-0xff: grayscale from black to white in 24 steps
решение2
Из руководства:man 5 terminfo
Чтобы изменить текущий цвет переднего плана или фона на терминале типа Tektronix, используйтесетаф(установить передний план ANSI) исетаб(установить фон ANSI) илисетф(установить передний план) исетб(установить фон). Они принимают один параметр, номер цвета. Документация SVr4 описывает толькосетаф/сетаб; в проекте XPG4 говорится, что «Если терминал поддерживает escape-последовательности ANSI для установки фона и переднего плана, их следует кодировать каксетафисетаб, соответственно. Если терминал поддерживает другие escape-последовательности для установки фона и переднего плана, они должны быть закодированы каксетфисетб, соответственно. Функция vidputs() и функции refresh используютсетафисетабесли они определены».
Итак, ответ:сетафозначаетУстановить передний план ANSI, т.е. использовать управляющие последовательности ANSI, исетфозначаетУстановить передний план(используя некоторые escape-последовательности, отличные от ANSI).
решение3
Два набора возможностей используют разный порядок для красного/синего в списке цветов ANSI.
Как уже отмечалось, это объясняется в ncursesстраница руководства terminfo. Немного истории:
- В начале (середина 1990-х гг.) наиболее доступны"цвет"Используемые описания терминалов
setf/setb
. - Возникла некоторая путаница с пользователями termcap, которые использовали соответствующие
Sf/Sb
коды вместоsetaf/setab
(иAF/AB
для termcap) — но использовали escape-последовательности ANSI (которые работают с termcap) вместо использованияправильныйвозможности с возможностями ANSI. - По этой причине вы найдете терминальные записи с двумя приравненными, например,мгтерм,интерикс,лучше(а также несколько записей в файле termcap FreeBSD, опять же из-за этой первоначальной путаницы в сочетании с нежеланием других вносить поправки в свои программы).
ANSI setaf/setab
были добавлены довольно поздно в историю terminfo, как вы можете заключить из их положения всписок строк возможностей. Имейте в виду, что они добавлялись поэтапно в течение нескольких лет, и некоторые системы отличались (в ncurses есть несколько примеров, таких какCaps.hpux
(чтобы его можно было скомпилировать для соответствия этим системам). Это объясняет небольшое количество полезных описаний терминалов, которые можно было бы использовать для справки.
При всем при этом тот факт, что существующие setf/setb
строки не соответствовали порядку ANSI, не был сразу замечен, что привело к некоторымисправления в 1998 году, и часто задаваемые вопросыПочему красный и синий поменяны местами?.
Хотя 8-цветную последовательность ANSI можно было расширить до 16 цветов (предположив, что цвета 8–15 являются более яркими версиями цветов 0–7), не было никаких веских причин для изобретения схемы, которая бы выходила setf/setb
за рамки первых 16 цветов.