2010-01-08 2 views
10

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

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

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

ответ

12

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

+6

'isatty()' не является стандартным C, но это POSIX, поэтому он будет доступен на всех Unix-подобных платформах. –

+0

Версия ISO доступна также в Windows. Довольно аккуратно. –

4

В (нестандартном) языке 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 
$ 
+0

Мне очень понравился тест в Perl и Shell. Довольно круто. –

7

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

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

+1

, вероятно, лучше использовать '' isatty (STDOUT_FILENO) '' вместо использования '' fileno() '' – nimrodm

 Смежные вопросы

  • Нет связанных вопросов^_^