2>&1
导致popen
陷阱stderr
.
我想了解它是如何工作的.
2,>,&1在这里扮演什么角色?
我需要学习什么来理解它们?
它是一个shell构造.这意味着将stirect(>
)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
因为它们都是混合的.
效果与dup2(1,2);
C 相同.
考虑
#include#include int main(void) { dup2(1,2); fprintf(stdout, "printed to stdout\n"); fprintf(stderr, "printed to stderr\n"); }
如果这是编译并运行如下:
# ./a.out >output
这两行都将打印到一个名为的文件中output
.
如果通过注释掉dup2()
行来运行代码.现在只有第一行将打印到文件,第二行将打印在控制台上,即使它只捕获stdout
使用重定向(>
).
其他来源:
https://www.gnu.org/software/bash/manual/html_node/Redirections.html
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true