2>& 1对popen做了什么?

时间:2015-12-17 06:15:09

标签: c popen

2>&1会导致popen陷入stderr

我想了解它是如何运作的。

2,>,&,1在这里扮演什么角色? 我需要学习什么来理解它们?

3 个答案:

答案 0 :(得分:6)

它是一个shell构造。这意味着将(> stderr 2)重定向到 stdout 1)所在的位置。 1stdout文件描述符的文件,2stderr的文件描述符。

$ command 2>&1 #redirect stderr to stdout

$ command 1>&2 #redirect stdout to stderr

$ command 1>output 2>errors #redirect stdout to a file called "output"
                            #redirect stderr to a file called "errors"

popen()仅捕获stdout。因此,使用命令运行命令无法捕获来自stderr的消息。

例如,使用

  FILE *fp = popen("command", "r");

只能抓取stdout command(使用fp阅读)。但是有了这个

  FILE *fp = popen("command 2>&1", "r");

stdoutstderr被捕获。但是通过此重定向,stdoutstderr无法区分,因为它们都是混合的。

效果与C中的dup2(1,2);相同。

考虑

#include <stdio.h>
#include <unistd.h>

int main(void)
{
   dup2(1,2);
   fprintf(stdout, "printed to stdout\n");
   fprintf(stderr, "printed to stderr\n");
}

如果编译并运行为:

# ./a.out >output

这两行都将打印到名为output的文件中。

如果通过注释掉dup2()行来运行代码。现在只有第一行打印到文件,第二行将打印在控制台上,即使它只使用重定向(stdout)捕获>

其他来源:

答案 1 :(得分:2)

这是一个基本的文件描述符重定向。它会将stderr2)中的所有内容重定向到> stdout&1)的文件描述符。

一件好事是你也可以同时将stdout重定向到其他地方 E.g:

command >some-file 2>&1 

有关文件描述符重定向的更多信息(在unix / linux中),我建议https://www.gnu.org/software/bash/manual/html_node/Redirections.html

答案 2 :(得分:1)

MSDN说:

  

找到File.txt,然后重定向句柄1(即STDOUT)和   处理2(即STDERR)到Search.txt,输入:findfile   file.txt&gt; search.txt 2&lt;&amp; 1

另外

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

您也可以参考2.7 Redirection获取详细信息。

进一步研究的链接: