tput 的“setf”和“setaf”有什么区别?

tput 的“setf”和“setaf”有什么区别?

该命令tput有两个不同的选项用于设置颜色setfsetaf,但它们在我的计算机上似乎都工作得很好:

$ 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 草案说 “如果终端支持 ANSI 转义序列来设置背景和前景,则应将它们编码为塞塔夫塞塔布, 分别。如果终端支持其他转义序列来设置背景和前景,则应将它们编码为塞特夫设定值, 分别。 vidputs() 函数和刷新函数使用塞塔夫塞塔布如果它们被定义的话。”

所以答案是:塞塔夫方法设置 ANSI 前景,即使用 ANSI 转义序列,并且塞特夫方法设置前景(使用 ANSI 以外的一些转义序列)。

答案3

两组功能在 ANSI 颜色列表中使用不同的红/蓝顺序。

如前所述,ncurses 中对此进行了解释terminfo 手册页。一些历史:

  • 早期(20 世纪 90 年代中期),最可用“颜色”使用的终端描述setf/setb
  • termcap 用户使用相应的Sf/Sb代码而不是setaf/setab(以及AF/ABtermcap),但使用 ANSI 转义序列(与 termcap 一起使用)而不是使用正确的具有 ANSI 功能的功能。
  • 因此,您会发现两者相等的终端条目,例如,毫克术语,因特克斯,贝特姆(以及 FreeBSD 的 termcap 文件中的几个条目,同样是由于最初的混乱以及其他人不愿意修改他们的程序)。

ANSIsetaf/setab在 terminfo 的历史中添加得相当晚,您可以从它们在 terminfo 中的位置推断出能力字符串列表。请记住,这些是在几年内分阶段添加的,并且某些系统有所不同(ncurses 有一些示例,例如Caps.hpux让它被编译以匹配这些系统)。这说明可供参考的有用终端描述数量很少。

尽管如此,现有setf/setb字符串与 ANSI 顺序不匹配的事实并没有立即被注意到,这导致了一些问题1998年修复,以及常见问题解答为什么红/蓝互换?

虽然可以将 8 色 ANSI 序列扩展到 16 色(假设颜色 8-15 是 0-7 的更亮版本),但没有充分的理由发明一种方案来扩展setf/setb到前 16 种颜色。

相关内容