Чим відрізняється 'setf' від tput і 'setaf'?


17

У команди tputє два різні варіанти встановлення кольору, setfі setaf, однак, вони обидва працюють на моєму комп’ютері:

$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'

Здається, схожа подвійність з setbі setab.

Яка різниця між двома варіантами?


1
Докладні відомості див. На terminfo(5)сторінці чоловіка, яка постачається ncurses.
Stéphane Chazelas

Відповіді:


15

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

tputне видається, що насправді використовуються наявні діапазони кольорів послідовності ANSI. Для будь-якого n > 7, tput setaf nне робить ніякого впливу на текст в моєму терміналі.
Кайл Странд

Насправді, це могло бути лише химерністю мого оточення; для мене результати з tput setf 2і tput setaf 2є обома .[32m .
Кайл Странд

5

З посібника: man 5 terminfo

Щоб змінити поточний передній або фоновий колір на терміналі типу Tektronix, використовуйте setaf (встановити передній план ANSI) та setab (встановити фон ANSI) або setf (встановити передній план) та setb (встановити фон). Вони беруть один параметр, кольорове число. Документація SVr4 описує лише setaf / setab ; У чернетці XPG4 йдеться про те, що "Якщо термінал підтримує послідовності виходу ANSI для встановлення фону та переднього плану, вони повинні бути кодовані відповідно до setaf та setab . Якщо термінал підтримує інші послідовності виходу для встановлення фону та переднього плану, вони повинні бути кодовані як setf та сетбвідповідно. Функція vidputs () та функції оновлення використовують setaf та setab, якщо вони визначені. "

Отже, відповідь: setaf означає встановити передній план ANSI , тобто використовувати послідовності відходу ANSI, а setf означає встановити передній план (використовуючи деякі послідовності втечі, відмінні від ANSI).


3

У двох наборах можливостей використовується різний порядок для червоного / синього у списку кольорів ANSI.

Як зазначалося, це пояснюється на сторінці ncurses terminfo . Деякі історії:

  • На початку (середина 1990-х років) використовуються найбільш доступні "кольорові" термінальні описи setf/setb.
  • Була певна плутанина з користувачами termcap, які використовували відповідні Sf/Sbкоди, а не setaf/setabAF/ABдля termcap) - але використовуючи послідовності аварійних передач ANSI (які працюють з termcap), а не використовували правильні можливості з можливостями ANSI.
  • Через це ви знайдете термінальні записи з двома прирівняними, наприклад, mgterm , interix , beterm (а також декілька записів у файлі termcap FreeBSD, знову ж таки через цю первісну плутанину в поєднанні з небажанням інших вносити зміни до своїх програм).

ANSI setaf/setabбули додані досить пізно в історії терміна, оскільки ви можете зробити висновок з їх позиції у списку рядків можливостей . Майте на увазі, що вони додавались поетапно протягом декількох років, а деякі системи відрізнялися (ncurses має кілька прикладів, Caps.hpuxщоб дозволити їх складати для відповідності цим системам). Це пояснювало малу кількість корисних описів терміналів, які можуть бути використані для довідок.

Зважаючи на це, той факт, що існуючі setf/setbрядки не відповідали порядку ANSI, не відразу було помічено, що призвело до деяких виправлень у 1998 році , і faq Чому червоний / синій замінений? .

Хоча можна було розширити 8-кольорову послідовність ANSI до 16-ти кольорів (припускаючи, що кольори 8-15 були яскравішими версіями 0-7), не було поважних причин для створення схеми подовження setf/setbостанніх 16 кольорів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.