13 votes

Déterminer si la sortie du processus est redirigée en C/C++.

Je suis en train d'écrire un utilitaire de ligne de commande pour Linux. Si la sortie (stdout) est destinée à un shell, il serait agréable d'imprimer des échappatoires pour coloriser la sortie. Mais si la sortie est redirigée, ces échappatoires bash ne devraient pas être imprimés, ou le contenu pourrait casser les analyseurs qui comptent sur cette sortie.

Il y a plusieurs programmes qui font cela (sucer comme ack ) mais ceux que j'ai trouvés étaient écrits en Perl et je n'ai pas réussi à trouver comment ils s'y prenaient.

Je voulais utiliser C/C++ pour écrire mon utilitaire.

13voto

Andreas Bonini Points 15709

Vous pouvez utiliser isatty sur linux. Cette fonction n'est évidemment pas standard C, puisque - par exemple - sur de nombreuses plateformes vous ne pouvez pas rediriger la sortie vers un fichier.

9voto

t0mm13b Points 21031

Jetez un coup d'œil à ce 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);
    /* ... */
}

Cette fonction renvoie 1 si le programme est redirigé. Remarquez que dans le main(...) comment on l'appelle. Si le programme devait s'exécuter et qu'il était redirigé vers stderr ou vers un fichier, le programme sort immédiatement.

5voto

William Pursell Points 56211

En C (non standard), vous pouvez utiliser isatty(). En perl, on le fait avec l'opérateur -t :

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

$

Dans le shell, vous pouvez utiliser test :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X