shell中标准输出,标准输⼊,标准错误输出详解
前⾔.
UNIX系统shell使⽤⽂件描述符0与进程的标准输⼊(⼀般是键盘)相关联,⽂件描述符1与标准输出(⼀般是显⽰器)相关联,⽂件描述符2与标准出错输出(⼀般是显⽰器)相关联。
1、可以将/dev/null看作"⿊洞". 它⾮常等价于⼀个只写⽂件. 所有写⼊它的内容都会永远丢失. ⽽尝试从它那⼉读取内容则什么也读不到.然⽽, /dev/null对命令⾏和脚本都⾮常的有⽤.
⽤处:
禁⽌标准输出.    1 cat $filename >/dev/null  # ⽂件内容丢失,⽽不会输出到标准输出.
禁⽌标准错误.    2>/dev/null 这样错误信息[标准错误]就被丢到太平洋去了.
2、1>/dev/null 2>&1的含义
> 代表重定向到哪⾥,例如:echo "123" > /
1 表⽰stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表⽰stderr标准错误
& 表⽰等同于的意思,2>&1,表⽰2的输出重定向等同于1
那么本⽂标题的语句:
1>/dev/null ⾸先表⽰标准输出重定向到空设备⽂件,也就是不输出任何信息到终端,说⽩了就是不显⽰任何信息。
2>&1 接着,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备⽂件,所以标准错误输出也重定向到空设备⽂件。
3、/dev/zero⽂件代表⼀个永远输出 0的设备⽂件,使⽤它作输⼊可以得到全为空的⽂件。因此可⽤来创建新⽂件和以覆盖的⽅式清除旧⽂件。
重定向过多是什么意思下⾯使⽤dd命令将从zero设备中创建⼀个10K⼤⼩(bs决定每次读写1024字节,count定义读写次数为10次),但内容全为0的⽂件。dd if=/dev/zero of=file count=10 bs=1024
shell中可能经常能看到:>/dev/null 2>&1
命令的结果可以通过%>的形式来定义输出
分解这个组合:“>/dev/null 2>&1” 为五部分。
1:> 代表重定向到哪⾥,例如:echo "123" > /
2:/dev/null 代表空设备⽂件
3:2> 表⽰stderr标准错误
4:& 表⽰等同于的意思,2>&1,表⽰2的输出重定向等同于1
5:1 表⽰stdout标准输出,系统默认值是1,所以">/dev/null"等同于 "1>/dev/null"
因此,> /dev/null 2> &1也可以写成“1> /dev/null 2> &1”
那么本⽂标题的语句执⾏过程为:
1>/dev/null :⾸先表⽰标准输出重定向到空设备⽂件,也就是不输出任何信息到终端,说⽩了就是不显⽰任何信息。
2>&1 :接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备⽂件,所以标准错误输出也重定向到空设备⽂件。
最常⽤的⽅式有:
command > file 2>file  与command > file 2>&1
它们有什么不同的地⽅吗?
⾸先command > file 2>file 的意思是将命令所产⽣的标准输出信息,和错误的输出信息送到file 中mand  > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使⽤了FD1和FD2两个同时去抢占file 的管道。
⽽command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了⼀次,也只使⽤了⼀个管道FD1,它包括了stdout和stderr的内容。
从IO效率上,前⼀条命令的效率要⽐后⾯⼀条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。