开发者

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

开发者 https://www.devze.com 2022-12-15 16:36 出处:网络
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 esca

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

精彩评论

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