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

时间:2010-01-08 12:22:18

标签: c shell stdout

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

有几个程序执行此操作(吮吸为ack)但我找到的是用Perl编写的,我无法知道他们是如何做到的。

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

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:7)

看一下这段代码:

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或文件,则程序会立即退出。

答案 2 :(得分:4)

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

$ perl -E 'say -t STDOUT'
1
$ perl -E 'say -t STDOUT' | cat

$

在shell中你可以使用test:

$ test -t 1 && echo is a tty
is a tty
$ (test -t 1 && echo is a tty ) |  cat
$