2010-01-08 10 views
10

Estoy escribiendo la utilidad de línea de comandos para Linux. Si la salida (stdout) va a un shell, sería bueno imprimir algunos escapes para colorear la salida. Pero si la salida se redirecciona, esos bash escapes no deberían imprimirse, o el contenido podría romper analizadores que dependen de esa salida.Determine si la salida del proceso se redirige en C/C++

Hay varios programas que hacen esto (aspirar como ack) pero los que encontré fueron escritos en Perl y no pude averiguar cómo lo hicieron.

Quería usar C/C++ para escribir mi utilidad.

Respuesta

12

Puede usar isatty en Linux. Esta función obviamente no es estándar C, ya que, por ejemplo, en muchas plataformas no se puede redirigir la salida a un archivo.

+6

'isatty()' no es C estándar, pero es POSIX, por lo que estará disponible en todas las plataformas tipo Unix. –

+0

La versión ISO también está disponible en Windows. Con buena pinta. –

4

En (no estándar) C, puede usar isatty(). En Perl, se realiza con el operador -t:

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

$ 

en la cáscara puede utilizar la prueba:

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

Me gustó mucho la prueba en Perl y Shell. Muy genial. –

7

Tener un vistazo a este código:

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

Esa función devolverá 1 si el programa está siendo redirigido. Observe en el main(...) cómo se llama. Si el programa debía ejecutarse y se lo redirecciona al stderr o a un archivo, el programa se cierra inmediatamente.

+1

probablemente sea mejor usar '' isatty (STDOUT_FILENO) '' en lugar de usar '' fileno() '' – nimrodm

Cuestiones relacionadas