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


17

该命令tput有两个用于设置颜色的选项,setfsetaf,但是它们在我的计算机上似乎都可以正常工作:

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

setb和和似乎有相似的对偶性setab

两种选择之间有什么区别?


1
有关详细信息terminfo(5),请参见随附的手册页ncurses
斯特凡Chazelas

Answers:


15

setf仅限于8种颜色。setaf最多可以设置256种颜色。

(以下所有信息将特定于urxvt,因为这是我的终端机,但该信息与其他终端机相似,如果不相同)

两者setfsetaf提供不同的转义码。您可以在下面查看此内容:

# 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 > 7tput setaf n都不会影响我终端中的文本。
凯尔·斯特兰德

实际上,这可能只是我所处环境的一个怪癖;对我来说,从输出tput setf 2tput setaf 2两个 .[32m
Kyle Strand

5

从手册中: man 5 terminfo

要更改Tektronix型终端上的当前前景或背景颜色,请使用setaf(设置ANSI前景)和setab(设置ANSI背景)或setf(设置前景)和setb(设置背景)。它们采用一个参数,即色号。SVr4文档仅描述了setaf / setab ; XPG4草案说: “如果终端支持ANSI转义序列来设置背景和前景,则应分别将其编码为setafsetab。如果终端支持其他转义序列来设置背景和前景,则应将其编码为setf和。塞特, 分别。如果定义了vidputs()函数和刷新函数,则使用setafsetab。”

因此答案是:setaf表示设置ANSI前景,即使用ANSI转义序列,而setf表示设置前景(使用ANSI以外的某些转义序列)。


3

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

如前所述,它在ncurses terminfo手册页中进行了说明。一些历史:

  • 早期(1990年代中期),使用了大多数可用的“彩色”端子说明setf/setb
  • 与使用相应Sf/Sb代码而不是setaf/setab(和AF/ABtermcap)使用而是使用ANSI转义序列(与termcap一起使用)而不是使用具有ANSI功能的正确功能的termcap用户有些困惑。
  • 因此,您会发现带有两个等价的终端条目,例如mgterminterixbeterm(以及FreeBSD的termcap文件中的几个条目,同样是由于这种最初的混淆加上其他人不愿修改其程序)。

setaf/setab可以在terminfo的历史中添加ANSI ,因为您可以从它们在功能字符串列表中的位置推断出来。请记住,这些是在几年内分阶段添加的,并且某些系统有所不同(ncurses提供了一些示例,例如Caps.hpux让其进行编译以匹配那些系统)。这说明有用的终端描述数量很少,可用于参考。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.