В чем разница между 'setf' и 'setaf' tput?

В чем разница между 'setf' и 'setaf' tput?

Команда 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/setabAF/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 цветов.

Связанный контент