Определите, перенаправляется ли вывод процесса в C / C ++ - PullRequest
11 голосов
/ 08 января 2010

Я пишу утилиту командной строки для Linux. Если вывод (stdout) идет в оболочку, было бы неплохо напечатать некоторые экранированные символы, чтобы раскрасить вывод. Но если вывод перенаправляется, эти bash-экранирования не должны печататься, иначе содержимое может нарушить синтаксические анализаторы, которые полагаются на этот вывод.

Есть несколько программ, которые делают это (отстой как ack), но те, что я нашел, были написаны на Perl, и я не мог узнать, как они это сделали.

Я хотел использовать C / C ++ для написания своей утилиты.

Ответы [ 3 ]

12 голосов
/ 08 января 2010

Вы можете использовать isatty в Linux. Эта функция, очевидно, не является стандартной C, поскольку, например, на многих платформах вы не можете перенаправить вывод в файл.

7 голосов
/ 08 января 2010

Посмотрите на этот код:

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

Эта функция вернет 1, если программа перенаправляется. Обратите внимание на main(...), как это называется. Если программа должна была быть запущена и перенаправлена ​​на stderr или в файл, программа немедленно завершается.

4 голосов
/ 08 января 2010

В (нестандартном) C вы можете использовать isatty (). В Perl это делается с помощью оператора -t:

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

$

В оболочке вы можете использовать тест:

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