该命令tput有两个不同的选项来设置颜色setf和setaf,但它们在我的计算机上似乎都可以正常工作:
$ tput setf 2 && echo 'Hello world!'
$ tput setaf 2 && echo 'Hello world!'
Run Code Online (Sandbox Code Playgroud)
似乎有一个类似的两重性与setb和setab。
这两个选项有什么区别?
phe*_*mer 17
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
Run Code Online (Sandbox Code Playgroud)
从我的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)
Run Code Online (Sandbox Code Playgroud)
因此,从上面的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
Run Code Online (Sandbox Code Playgroud)
两组功能在 ANSI 颜色列表中使用不同的红/蓝顺序。
如前所述,ncurses terminfo 手册页对此进行了解释。一些历史:
setf/setb。Sf/Sb代码而不是setaf/setab(以及AF/ABtermcap),而是使用 ANSI 转义序列(与 termcap 一起使用)而不是使用带有 ANSI 功能的正确功能。ANSIsetaf/setab在 terminfo 的历史中添加得相当晚,因为您可以从它们在功能字符串列表中的位置推断出来。请记住,这些是在几年内分阶段添加的,并且某些系统有所不同(ncurses 有一些示例,例如Caps.hpux让它编译以匹配这些系统)。这说明可供参考的有用终端描述数量很少。
尽管如此,现有setf/setb字符串与 ANSI 顺序不匹配的事实并没有立即被注意到,这导致了1998 年的一些修复,以及常见问题解答为什么红色/蓝色互换?。
虽然可以将 8 色 ANSI 序列扩展到 16 色(假设颜色 8-15 是 0-7 的更亮版本),但没有充分的理由发明一种方案来扩展到setf/setb前 16 种颜色。
从手册: man 5 terminfo
要更改泰克类型终端上的当前前景或背景颜色,请使用setaf(设置 ANSI 前景)和setab(设置 ANSI 背景)或setf(设置前景)和setb(设置背景)。这些需要一个参数,颜色编号。SVr4 文档仅描述了setaf / setab;XPG4草案说 “如果终端支持ANSI转义序列设置背景和前景,它们应该分别编码为setaf和setab。如果终端支持其他转义序列设置背景和前景,它们应该编码为setf和设置, 分别。vidputs() 函数和刷新函数使用setaf和setab(如果已定义)。”
所以答案是:setaf表示Set ANSI foreground,即使用 ANSI 转义序列,而setf表示Set Foreground(使用除 ANSI 以外的一些转义序列)。