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