这是一个外壳结构。这意味着将 (>) stderr(2) 重定向到 stdout(1) 所到之处。 1 是文件stdout 的文件描述符,2 是stderr 的文件描述符。
$ 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。因此运行命令 using 无法捕获来自其stderr 的消息。
例如,用
FILE *fp = popen("command", "r");
只有stdout 中的command 可以被捕获(使用fp 读取)。但是有了这个
FILE *fp = popen("command 2>&1", "r");
stdout 和 stderr 被捕获。但是通过这种重定向,stdout 与 stderr 无法区分,因为它们都是混合的。
效果与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 (>)。
其他来源: