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

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

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

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

11
задан Edu Felipe 8 January 2010 в 22:32
поделиться

3 ответа

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

.
12
ответ дан 3 December 2019 в 04:52
поделиться

In (niet-standaard) C kunt u isatty () gebruiken. In perl wordt dit gedaan met de operator -t:

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

$

In de shell kun je test:

$ test -t 1 && echo is a tty
is a tty
$ (test -t 1 && echo is a tty ) |  cat
$
4
ответ дан 3 December 2019 в 04:52
поделиться

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

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

7
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: