【APUE习题 3.5】./a.out > outfile 2>&1和./a.out 2>&1 > outfile的区别
int main()
{
printf("output to stdio\n");
fprintf(stderr,"output to stderr\n");
return 1;
}
结果如下:
qun@ThinkPad ~/tmp $ ./a.out > outfile 2>&1
qun@ThinkPad ~/tmp $ cat outfile
output to stderr
output to stdin
qun@ThinkPad ~/tmp $ ./a.out 2>&1 > outfile
output to stderr
原因是:
由于bash从左往右处理,在./a.out > outfile的时候,将a.out的fd 1定向到了outfile文件的fd上,然后才遇到2>&1,这时再将a.out的文件描述符2定向到文件描述符1上,这样stderr和stdout,就都到outfile上了。
int main()
{
printf("output to stdio\n");
fprintf(stderr,"output to stderr\n");
return 1;
}
结果如下:
qun@ThinkPad ~/tmp $ ./a.out > outfile 2>&1
qun@ThinkPad ~/tmp $ cat outfile
output to stderr
output to stdin
qun@ThinkPad ~/tmp $ ./a.out 2>&1 > outfile
output to stderr
原因是:
由于bash从左往右处理,在./a.out > outfile的时候,将a.out的fd 1定向到了outfile文件的fd上,然后才遇到2>&1,这时再将a.out的文件描述符2定向到文件描述符1上,这样stderr和stdout,就都到outfile上了。
而下面一个则不然,先遇到2>&1,这时将a.out的文件描述符2(标准错误输出)定向到文件描述符1(标准输出,即终端)上。再遇到 > outfile,这时将a.out的文件描述符1到outfile这个文件。
原文出处:http://hi.baidu.com/malloc_delete/item/b9f9d74f1e31130be8350492