我有一个C程序,它使用SGR ("Select Graphic Rendition") ANSI终端转义序列来产生颜色输出。
但是,如果将输出重定向到文本文件,则转义序列应该不输出,因为它们被视为"垃圾"在生成的文件中。要处理此问题,可以使用 isatty (3)函数:仅当返回true
时输出颜色。实际上,这就是像 grep (1)这样的程序。
但是如果正在将输出重定向到Unix管道,例如,| less
,至少在我的情况下,主要是有人将我的程序的输出管道输出,那么转义序列应输出 less (1)正确处理它们并以彩色打印。
在使用 isatty (3)和 fstat (3)进行一些测试后,我已经制作了这个表C
代表我的C程序, "应该?"列是我是否应该输出颜色,其余列是T / F作为 isatty 或 fstat (STDOUT_FILENO
)的返回值:
COMMAND Should? isatty ISCHR ISFIFO ISREG
======== ======= ====== ===== ====== =====
C T T T F F
C > file F F F F >>T<<---- The interesting case.
C | less T F F T F
因此,当stdout上的ISREG
结构上的stat
为T时,似乎我想要输出颜色,除了。
这样做有什么警告吗?如果有,是否有更好的方法来获得我想要的东西?
注意:我还有一个类似 grep &#39; s --color
选项的选项,用于指定{{ 1}}或auto
(或always
只需而不是完全指定任何选项。我希望使用 fstat 和none
可以使ISREG
案例在大多数情况下更好。