开发者

Determine whether process output is being redirected in C/C++

I'm writing command line utility for Linux. If the output (stdout) is going to a shell it would be nice to print some escapes to colorize output. But if the output is being redirected those bash escapes shouldn't be print, or the conten开发者_JAVA百科t might break parsers that rely on that output.

There are several programs that do this (suck as ack) but the ones I found were written in Perl and I couldn't find out how they did it.

I wanted to use C/C++ to write my utility.


You can use isatty on linux. This function is obviously not standard C, since - for example - on many platforms you can't redirect the output to a file.


Have a look at this code:

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);
    /* ... */
}

That function will return 1 if the program is being redirected. Notice in the main(...) how it is called. If the program was to run and is being redirected to stderr or to a file the program exits immediately.


In (non-standard) C, you can use isatty(). In perl, it is done with the -t operator:

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

$

In the shell you can use test:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜