码迷,mamicode.com
首页 > 其他好文 > 详细

【转】./a.out 2>&1 > outfile

时间:2015-02-08 20:44:51      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

原文网址:http://www.cnblogs.com/zhaoyl/archive/2012/10/22/2733418.html

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;
}

// 结果如下:
$ ./a.out > outfile 2>&1
$ cat outfile
output to stderr
output to stdin
$ ./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这个文件。结果是,标准错误输出到了屏幕,而标准输出定向到了outfile!

  也可以写shell脚本测试一下:

  

技术分享
#!/bin/bash

touch output

test () {
    echo "before error.."
    someerror       #错误,变量或命令未定义
    echo "after error ..."
}

test  2>&1 >output
技术分享

【转】./a.out 2>&1 > outfile

标签:

原文地址:http://www.cnblogs.com/wi100sh/p/4280410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!