Определите, перенаправляется ли процесс на C/С++

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

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

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

Ответ 1

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

Ответ 2

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

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 или в файл, программа немедленно выгружается.

Ответ 3

В (нестандартном) 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
$