2>&1
会导致popen
陷入stderr
。
我想了解它是如何运作的。
2,>,&,1在这里扮演什么角色? 我需要学习什么来理解它们?
答案 0 :(得分:6)
它是一个shell构造。这意味着将(>
) 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
。因此,使用命令运行命令无法捕获来自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
)捕获>
。
其他来源:
答案 1 :(得分:2)
这是一个基本的文件描述符重定向。它会将stderr
(2
)中的所有内容重定向到>
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获取详细信息。
进一步研究的链接: