Less(1) 处理VT100系列终端多行颜色属性时行尾属性丢失问题咨询
为什么
less会弄丢跨多行的终端颜色属性? 其实这不是“预期行为”,但确实是less默认的处理逻辑——它会在每一行显示结束后强制重置所有终端属性,所以你第一行末尾没关闭的紫色(\e[35m),到了less里就被强行重置了,第二行自然没法继承这个颜色。
问题根源
less的默认设计是为了避免分页显示时,残留的属性影响后续内容(比如前一行的颜色跑到下一行不该出现的位置),所以它会在渲染完每一行后自动发送终端重置命令(\e[m)。不管你的原输出里有没有主动关闭属性,它都会这么做。
解决办法很简单
给less加上-R(全称--RAW-CONTROL-CHARS)参数,让它保留原始的终端控制字符,包括那些跨多行未关闭的颜色属性:
./attr.sh | less -R
加了这个参数后,less就会老老实实遵循你脚本里的颜色控制序列,不再擅自重置每行的属性,你就能看到第二行开头保持紫色,直到\e[m之后恢复正常样式。
顺带提一句:还有个-r参数也能实现类似效果,但-R更安全——它只识别处理ANSI颜色和样式的控制字符,而-r会处理所有终端控制字符,很可能导致显示乱码,所以优先用-R就好。
内容的提问来源于stack exchange,提问作者Phi
相关产品推荐
相关产品推荐

