Linux指令的标准输入,输出及错误——2>&1

今天在看chroot的时候,发现一个2>&1的东西,觉得跟指令完全不相关,有点像是正则表达式的样子,之前也稍微听过别人说是跟标准输入输出有关系,但是没有搞清楚过具体的作用,这里就把这个相关的知识点写一写吧

一句话概括

为了给赶时间的童鞋看,我就用一句话简要概括:

2>&1的作用是将程序运行时的标准错误信息添加到标准输出中

具体内容

具体碰到的指令是这样的

nohup command>/dev/null 2>&1 &

先说几个基本的符号

  • /dev/null 表示空设备文件
  • 0表示stdin标准输入
  • 1表示stdout标准输出
  • 2表示stderr标准错误

指令分析

据此我们来对这条指令进行拆分,nohup是指当前用户和系统会话下的进程忽略响应HUP消息,&是指该命令以后台job的形式运行。剩下的部分为:

command>/dev/null 2>&1

这条指令中,/dev/null表示的是一个空设备,也就是command的执行结果重定向到空设备中了,即执行结果不显示。
对于前半条命令:

command>/dev/null

这条命令中,command是省略了1这个标准输出的,即这条指令相当于:

command 1>/dev/null,是command执行的结果标准输出1重定向至/dev/null中

最后我们来看2>&1的作用,由于我们在上面分析可以得出:

command>/dev/null等价于command 1>/dev/null

据此可以得到,2>&1是将标准错误重定向至标准输出的位置,即2>/dev/null,由于1并不能代表/dev/null,因此指令不是2>1,而是2>&1,这里的&1就是对标准输出位置的引用:

1>/dev/null 2>/dev/null
1>/dev/null 2>&1

这两者的区别在于前者需要打开两次/dev/null,而第二种方式只需要打开文件一次,效率更高

参考链接

Linux里的2>&1究竟是什么:https://blog.csdn.net/ggxiaobai/article/details/53507530

0%