指点迷津之--Linux shell中“2>&1”的含义

【参考】:
①https://www.cnblogs.com/caolisong/archive/2007/04/25/726896.html
②https://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean

【问题】在Unix shell中,若我们想将标准错误输出(stderr)和标准输出(stdout)合并到标准输出(stdout)流中进行进一步的操作,我们可以在命令的末尾添加以下内容:
2>&1
那么,问题来了,为什么是添加“2>&1”,而不是“2>1”呢?

首先,我们【回顾】一下,数据流重定向:
·标准输入(stdin) : 文件描述符为0,使用 < 或 << ;
·标准输出(stdout) : 文件描述符为1,使用 > 或 >> ;
·标准错误输出(stderr) : 文件描述符为2,使用 2> 或 2>> ;

【回归】主题:
命令 command > output.txt 2>&1 , 它表示将command的标准输出重定向到output.txt文件,&1 : 准确的说是文件描述符1,2>&1表示将标准错误输出重定向到标准输出,而标准输出已经重定向到output.txt文件了,那么,标准错误输出也被重定向到output.txt文件了

而 2>1, 2与>结合代表错误输出重定向,1则代表重定向到文件名为1的文件,而不代表标准输出。这也就解答了为什么要合并标准输出与错误输出是添加“2>&1”,而不是“2>1”了。

为了便于【理解】,我们可以在终端做如下测试:
·ls 2>1 :不会报没有2文件的错误,但会输出一个空的文件1;
·ls xxx(不存在的文件) 2>1 :没有xxx这个文件的错误输出到了1中;
·ls xxx(不存在的文件) 2>&1 :不会生成1这个文件了,不过错误输出重定向到标准输出了;
·ls xxx >out.txt 2>&1:实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。

【问题升华】
“2>&1”的位置该放在哪?
对比如下:
a. command > file 2>&1
该命令,现将 command 的标准输出重定向到 file 中,2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和标准错误都被重定向到file中。
实现重定向的关键系统调用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)

b. command 2>&1 >file
该命令,先标准错误拷贝了标准输出的行为,但此时的标准输出还在终端;接着>file输出才被重定向到file,但标准错误输出仍然保持在终端。
实现重定向的关键系统调用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)

补充:
【dup2函数】
头文件:#include<unistd.h>
定义函数:int dup2(int oldfd, int newfd);
函数说明:
    dup2用来复制参数oldfd所指的文件描述符,并将oldfd拷贝到参数newfd后一起返回。若参数newfd为一个打开的文件描述符,则newfd所指的文件会先被关闭,若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等等。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值