知道是否输出终端转义序列?

时间:2015-06-16 04:58:29

标签: c terminal pipe tty

我有一个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案例在大多数情况下更好。

0 个答案:

没有答案