1 | $ ls -al > /dev/null 2>&1 |
执行上面的命令之后你会发现终端没有任何输出,为什么会这样呢?
继续执行下面的命令
1 | $ ls -qwer > /dev/null 2>&1 |
发现还是没有任何输出,即使该命令是错误的。
造成这一切的根源在于命令最后面的2>&1
。
我们知道/dev/null
是linux
系统上的伪设备文件,可以被用来消除来自程序的输出。尤其是对于命令行程序而言有更大的意义。
/dev/null
看起来像是一个水漕,比如说一个可写的目标文件,然而只要有任何数据流被写入这个文件,都会被马上删除。
当用户不需要来自程序的输出信息时,这个命令是有用的。因为程序可能会生成大量的输出内容,而这会给分析日志的工作带来混乱。
对于/dev/null 2>&1
命令,2在linux上代表STDERR(标准错误输出),而1则代表STDOUT(标准输出)。因此,这个命令的最终解释就是将标准错误输出和标准输出重定向到/dev/null
,即消除这两种类型的输出。
我们再来具体分析下这个命令的构成,首先>
表示重定向,而被重定向的对象则是/dev/null
。而不是打印到终端。
这是否意味着该命令所有的输出都会被重定向到/dev/null
呢,并不是,因为它只会重定向标准输出。
因此,还需要加上2>&1
。表示将2(标准错误输出)重定向到1(标准输出)。那么&
代表什么意思呢?如果不加上&
的话,标准错误输出将会输出到名字为1的文件中。而&
会告诉系统1不是一个文件,而是一个标准输出描述符号。
最后,我们将标准输出和标准错误输出都重定向到了/dev/null
。而/dev/null
会将所有的输出内容全部清除掉。
小结:/dev/null是linux系统上一个特殊的设备文件,可以将任何命令的标准输出(不管是标准输出还是错误输出)清除掉。