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

C 知道是否输出终端转义序列?,c,terminal,pipe,tty,C,Terminal,Pipe,Tty,我有一个C程序,它使用ANSI终端转义序列生成颜色输出 然而,如果输出被重定向到文本文件,那么转义序列就不应该被输出,因为它们在生成的文件中会被视为“垃圾”。要处理此问题,可以使用isatty(3)函数:仅当返回true时才输出颜色。事实上,这就是像grep这样的程序所做的 但是,如果输出被重定向到Unix管道,例如,|less,至少在我的情况下,这主要是有人将我的程序输出重定向到的管道,那么转义序列应该被输出,因为less(1)正确地处理它们并以彩色打印 在使用isatty(3)和fstat(

我有一个C程序,它使用ANSI终端转义序列生成颜色输出

然而,如果输出被重定向到文本文件,那么转义序列就不应该被输出,因为它们在生成的文件中会被视为“垃圾”。要处理此问题,可以使用isatty(3)函数:仅当返回
true
时才输出颜色。事实上,这就是像grep这样的程序所做的

但是,如果输出被重定向到Unix管道,例如,
|less
,至少在我的情况下,这主要是有人将我的程序输出重定向到的管道,那么转义序列应该被输出,因为less(1)正确地处理它们并以彩色打印

在使用isatty(3)和fstat(3)进行了一些测试之后,我生成了这个表,其中
C
代表我的C程序,“应该?”列是我是否应该输出颜色,其余列是T/F,作为isattyfstat的返回值(
STDOUT\u FILENO
):

命令应该是什么?isatty ISCHR ISFIFO ISREG
======== ======= ====== ===== ====== =====
C T T F

C>file F>>t您还应该包括一个命令行标志,以便用户可以覆盖,类似于gnu grep的--color标志。请尝试
yourprogram | cat>file
。实际上,我有这样一个命令行选项。我只是想让“自动”设置更好。到猫的管道似乎是人为的。为什么会有人这样做?@PaulJ.Lucas:他们可能不会,但他们可能会做一些类似于
yourprogram|grep>file
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