shell "cmd 2>&1 >file" "cmd > file 2>&1" 的区别

  原帖: 是"2>&1 >file" 还是 ">file 2>&1" http://www.diybl.com/course/6_system/linux/Linuxjs/2008923/144844.html 这是参加IBM面试的一道题,解释如下两个命令.我当时只解释出一个命令,现在把正确解释提供出来:$ cat food 2>&1 >filecat: can't open food$ cat food >file 2>&1$一个Bourne或Korn shell经常提出的问题是,为什么只有第二个命令才能把标准输出(stdout)和标准错误(stderr)重定向到文件file中?在第一个命令中,shell里首先是2>&1,意味着标准错误重定向到与标准输出同样的地方。这无任何效果,因为两部分都重定向到屏幕上(省缺)。然后>file重定向标准输出到file,但标准错误仍然定向到终端。在第二个命令中,shell里首先是>file,意味着标准输出重定向到file。然后 2>&1将标准错误重定向到与标准输出同样的地方,既file。这也是我们想要的。其它常用重定向的命令command > filename      把标准输出重定向到一个新文件中command >> filename      把标准输出重定向到一个文件中(追加) command 1 > fielname     把标准输出重定向到一个文件中command 1 >> fielname     把标准输出重定向到一个文件中(追加)command 2 > filename     把标准错误重定向到一个文件中command 2 >> filename     把标准错误重定向到一个文件中(追加)command < filename      把filename文件作为标准输入command << delimiter     从标准输入中读入,直至遇到delimiter分界符command <&m        把把文件描述符m作为标准输入command >&m         把把标准输出重定向到文件描述符m中command <&-         把关闭标准输入背景知识:我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。下面就是这些文件描述符及它们通常所对应的文件名: 输入文件—标准输入    0    缺省是键盘输出文件—标准输出    1    缺省是屏幕错误输出文件—标准错误  2    缺省是屏幕 写了个程序验证了一下: #include int main(void) { printf("printf1/n"); printf("printf2/n"); perror("perror1/n"); perror("perror2/n"); //exit(1); return 0; } 执行结果 [me@localhost print_error]$ ls a.out print_error.c [me@localhost print_error]$ ./a.out > outfile 2>&1 [me@localhost print_error]$ cat outfile perror1 : Success perror2 : Invalid argument //不知道为啥这里会出现这个错误,谁知道指点一下,假如不输出重定向的话,不会出现这个问题。 printf1 printf2 [me@localhost print_error]$ ./a.out 2>&1 > outfile perror1 : Success perror2 : Success [me@localhost print_error]$ cat outfile printf1 printf2 [me@localhost print_error]$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值