tags:

views:

238

answers:

3

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 content 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.

+7  A: 

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.

Andreas Bonini
`isatty()` is not standard C, but it is POSIX, so it will be available on all Unix-like platforms.
Mike D.
+1  A: 
William Pursell
I really liked the test in Perl and Shell. Pretty cool.
Edu Felipe
+2  A: 

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.

Hope this helps, Best regards, Tom.

tommieb75