确定是否在C/C++中重定向过程输出

Edu*_*ipe 11 c shell stdout

我正在为Linux编写命令行实用程序.如果输出(stdout)转到shell,那么打印一些转义来着色输出会很不错.但是如果输出被重定向,则不应该打印那些bash转义,或者内容可能会破坏依赖于该输出的解析器.

有几个程序执行此操作(吮吸ack),但我发现的是用Perl编写的,我无法找到他们是如何做到的.

我想用C/C++来编写我的实用程序.

Tho*_*ini 12

你可以在linux上使用isatty.此功能显然不是标准C,因为 - 例如 - 在许多平台上,您无法将输出重定向到文件.

  • `isatty()`不是标准的C,但它是POSIX,所以它可以在所有类Unix平台上使用. (6认同)

t0m*_*13b 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);
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

如果重定向程序,该函数将返回1.请注意main(...)它的调用方式.如果程序要运行并被重定向到stderr文件或程序,则程序立即退出.


Wil*_*ell 5

在(非标准)C 中,您可以使用 isatty()。在 perl 中,它是通过 -t 运算符完成的:

$ perl -E '说 -t STDOUT'
1
$ perl -E '说 -t STDOUT' | 猫

$

在 shell 中您可以使用测试:

$ test -t 1 && echo 是一个 tty
是一个 tty
$ (test -t 1 && echo 是 tty ) | 猫
$