【问题标题】:Determine whether process output is being redirected in C/C++确定进程输出是否在 C/C++ 中被重定向
【发布时间】:2011-01-02 21:42:56
【问题描述】:

我正在为 Linux 编写命令行实用程序。 如果输出(stdout)将发送到 shell,最好打印一些转义符来为输出着色。但是,如果输出被重定向,则不应打印那些 bash 转义,否则内容可能会破坏依赖该输出的解析器。

有几个程序可以做到这一点(就像ack),但我发现的那些是用 Perl 编写的,我不知道他们是如何做到的。

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

【问题讨论】:

    标签: c shell stdout


    【解决方案1】:

    您可以在 Linux 上使用isatty。这个函数显然不是标准的 C,因为 - 例如 - 在许多平台上你不能将输出重定向到一个文件。

    【讨论】:

    • isatty() 不是标准 C,但它是 POSIX,因此它将在所有类 Unix 平台上可用。
    • Windows 也提供 ISO 版本。很整洁。
    【解决方案2】:

    看看这段代码:

    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 或文件,程序会立即退出。

    【讨论】:

    • 使用isatty(STDOUT_FILENO) 可能比使用fileno() 更好
    【解决方案3】:

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

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

    在shell中你可以使用test:

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

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 2010-11-13
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多