确定是否在C / C ++中重定向过程输出

我正在为Linux编写命令行实用程序。 如果输出(stdout)转到shell,那么打印一些转义来着色输出会很不错。 但是,如果输出被重定向,那么bash转义不应该打印,或者内容可能会破坏依赖于该输出的解析器。

有几个程序执行此操作(suck as ack )但我发现的是用Perl编写的,我无法找到他们是如何做到的。

我想用C / C ++来编写我的实用程序。

你可以在linux上使用isatty 。 此function显然不是标准C,因为 – 例如 – 在许多平台上,您无法将输出重定向到文件。

看看这段代码:

 int is_redirected(){ if (!isatty(fileno(stdout))){ fprintf(stdout, "argv, argc, someone is redirecting me elsewhere...\n"); return 1; } return 0; } /* ... */ int main(int argc, char **argv){ if (is_redirected()) exit(-1); /* ... */ } 

如果重定向程序,该函数将返回1。 请注意main(...)如何调用它。 如果程序要运行并被重定向到stderr或文件,程序将立即退出。

在(非标准)C中,您可以使用isatty()。 在perl中,它是使用-t运算符完成的:

 $ perl -E'说-t STDOUT'
 1
 $ perl -E'说-t STDOUT'| 猫

 $

在shell中你可以使用test:

 $ test -t 1 && echo是一个tty
是一个tty
 $(test -t 1 && echo是tty)| 猫
 $