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

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

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

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


person Edu Felipe    schedule 08.01.2010    source источник


Ответы (3)


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

person Thomas Bonini    schedule 08.01.2010
comment
isatty() — это не стандарт C, а POSIX, поэтому он будет доступен на всех Unix-подобных платформах. - person Mike D.; 08.01.2010
comment
Версия ISO доступна и для Windows. Довольно аккуратно. - person Matt Chambers; 16.04.2015

Взгляните на этот код:

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 или в файл, программа немедленно завершает работу.

person t0mm13b    schedule 08.01.2010
comment
вероятно, лучше использовать isatty(STDOUT_FILENO) вместо fileno() - person nimrodm; 06.03.2014

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