如何仅重置$(tput bold)格式而不清除其他终端属性?
问题原因
terminfo 规范中确实没有定义与 bold(开启加粗)对应的单独关闭加粗的 capname,这不是你遗漏了查找内容。
早期终端的属性设计里,加粗、淡色(dim)属于字体强度类别下的互斥属性,没有设计单独关闭加粗的控制指令,因此 terminfo 没有对应字段。
可行的解决方案
方案1:使用 SGR 22 转义序列(推荐,兼容绝大多数现代终端)
目前所有主流终端(xterm、GNOME Terminal、Konsole、iTerm2、Windows Terminal 等)都支持 ANSI SGR 22 控制序列,它的作用是仅将字体强度重置为普通级别,不会修改颜色、斜体、下划线等其他已生效的格式。
你可以直接在要结束加粗的位置插入转义序列 \e[22m,示例代码如下:
$(tput setaf 6) Part of this text can be $(tput bold)bold$(echo -ne '\e[22m') but the rest of the text still retains its initial color.
如果你不想硬编码转义序列,也可以通过 tput 直接指定 SGR 参数实现:tput sgr 0 0 (部分终端下等效于SGR 22),不过硬编码\e[22m的通用性更强。
方案2:状态跟踪恢复(兼容极端老旧终端)
如果你的使用场景需要兼容不支持 SGR 22 的老旧终端,可以通过维护格式状态栈的方式实现:
- 每次插入加粗开启指令前,先解析并记录当前流中所有生效的格式属性(前景色、背景色、斜体、下划线等)
- 要关闭加粗时,先执行
$(tput sgr0)重置所有属性,再把之前记录的所有格式属性重新输出一遍,即可恢复加粗前的格式状态。
这种方案兼容性最高,但需要你额外开发转义序列解析、状态维护的逻辑,实现成本更高。
内容的提问来源于stack exchange,提问作者oneastok
相关产品推荐
相关产品推荐

