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

确定是否在C/C+中重定向流程输出+;,c,shell,stdout,C,Shell,Stdout,我正在为Linux编写命令行实用程序。 如果输出(stdout)是一个shell,那么最好打印一些转义以对输出着色。但是如果输出被重定向,这些bash转义就不应该被打印出来,否则内容可能会破坏依赖于该输出的解析器 有几个程序可以做到这一点(比如ack),但我发现的那些程序是用Perl编写的,我不知道它们是如何做到的 我想用C/C++编写我的实用程序。可以在linux上使用。此函数显然不是标准C,因为(例如)在许多平台上无法将输出重定向到文件。在(非标准)C中,可以使用isatty()。在perl

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

有几个程序可以做到这一点(比如
ack
),但我发现的那些程序是用Perl编写的,我不知道它们是如何做到的

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

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

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

$ perl -E 'say -t STDOUT' 1 $ perl -E 'say -t STDOUT' | cat $ $perl-E'say-t STDOUT' 1. $perl-E'say-t STDOUT'| cat $ 在shell中,您可以使用测试:

$ test -t 1 && echo is a tty is a tty $ (test -t 1 && echo is a tty ) | cat $ $test-t1&&echo是一个tty 这是一个有趣的故事 $(测试-T1&&echo是tty)| cat $
请查看以下代码:

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或某个文件,程序将立即退出。

isatty()
不是标准C,但它是POSIX,因此它将在所有类似Unix的平台上可用。ISO版本也可在Windows上使用。非常整洁。可能最好使用
isatty(STDOUT\u FILENO)
而不是使用
FILENO()