现在的位置: 首页 > 综合 > 正文

一个常考重定向问题

2011年10月30日 ⁄ 综合 ⁄ 共 592字 ⁄ 字号 评论关闭

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上了。
  
  而下面一个则不然,先遇到2>&1,这时将a.out的文件描述符2定向到文件描述符1上,1是终端。再遇到 > outfile,这时将a.out的文件描述符1到outfile这个文件。后面重定向没有受到前面重定向的影响。

抱歉!评论已关闭.