APUE 3.5关于重定向有个容易迷惑人的问题:
./a.out > outfile 2>&1
./a.out 2>&1 > outfile
问两者区别?
1 int main() 2 { 3 printf("output to stdio "); 4 fprintf(stderr,"output to stderr "); 5 return 1; 6 }
结果如下:
1 qun@ThinkPad ~/tmp $ ./a.out > outfile 2>&1 2 qun@ThinkPad ~/tmp $ cat outfile 3 output to stderr 4 output to stdin 5 qun@ThinkPad ~/tmp $ ./a.out 2>&1 > outfile 6 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上,1是终端。再遇到 > outfile,这时将a.out的文件描述符1到outfile这个文件。后面重定向没有受到前面重定向的影响。