Ответ 1
Вы можете использовать isatty в linux. Эта функция, очевидно, не является стандартным C, поскольку, например, на многих платформах вы не можете перенаправить вывод в файл.
Я пишу утилиту командной строки для Linux. Если вывод (stdout) идет в оболочку, было бы неплохо напечатать некоторые экраны для раскраски вывода. Но если выход перенаправляется, эти экраны bash не должны печататься, или содержимое может сломать синтаксические анализаторы, которые полагаются на этот вывод.
Есть несколько программ, которые делают это (suck as ack
), но те, которые я нашел, были написаны на Perl, и я не мог узнать, как они это сделали.
Я хотел использовать C/С++ для написания моей утилиты.
Вы можете использовать isatty в linux. Эта функция, очевидно, не является стандартным C, поскольку, например, на многих платформах вы не можете перенаправить вывод в файл.
Посмотрите на этот код:
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
или в файл, программа немедленно выгружается.
В (нестандартном) 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 $