Linux中 2>&1 的含义

平时写shell脚本时经常见到命令或者定时任务的后面跟着2>&1的写法,举个例子大概如下面这样

定时任务中
0 */1 * * *  root /bin/sh /opt/log_clear.sh >/dev/null 2>&1
普通shell脚本中
yum install -y MariaDB-Galera-server MariaDB-client rsync >install.log 2>&1
echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf >/dev/null 2>&1

这个 /dev/null 不用多说了,相当于一个黑洞,Linux的所有数据进去后都会被直接丢弃,从里面读也不会读出任何数据,如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null

解释后面的2>&1的之前,先说Linux的三个输入输出标准,0 通常指标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR),上面2>&1中的2和1就是分别对应着标准错误输出(STDERR)和标准输出(STDOUT),而 >& 是一个符号,不能拆开,意思是合并两个输出文件,所以2>&1的含义就是将标准错误输出合并到标准输出

举个例子验证一下

[root@proxynode tomcat]# ls       //目录下原来有两个文件
readme.txt  tomcat.tar.gz
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls >a    //查询文件将结果重定向到a里面,下面命令可以看到a里面有正确的内容
[root@proxynode tomcat]# cat a
a
readme.txt
tomcat.tar.gz
[root@proxynode tomcat]# rm -f a
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls 1>a   //这里可以看到加了1和上面不加1效果一样,因为这里1就是标准输出的意思
[root@proxynode tomcat]# cat a
a
readme.txt
tomcat.tar.gz
[root@proxynode tomcat]# rm -f a
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls 2>a   //将错误重定向到a里面,可以看到a是空的,因为没有错误信息,标准信息没指定直接输出到控制台了
a  readme.txt  tomcat.tar.gz
[root@proxynode tomcat]#
[root@proxynode tomcat]# cat a
[root@proxynode tomcat]#

再来看关于错误输出的和最终组合的结果

[root@proxynode tomcat]# ls
readme.txt  tomcat.tar.gz
[root@proxynode tomcat]# ls test   //test文件不存在所以报错了,没指定输出直接控制台输出
ls: cannot access test: No such file or directory
[root@proxynode tomcat]#

  [root@proxynode tomcat]#
  [root@proxynode tomcat]# ls test >a  //这个是只将正确信息重定向,错误信息还是控制台直接输出了
  ls: cannot access test: No such file or directory
  [root@proxynode tomcat]# cat a     //上面命令会报错,所以文件里是空的
  [root@proxynode tomcat]# rm -f a
  [root@proxynode tomcat]#

[root@proxynode tomcat]# ls test 2>a   //指定错误信息重定向到a,下面看到a的内容包含了错误信息
[root@proxynode tomcat]# cat a
ls: cannot access test: No such file or directory
[root@proxynode tomcat]#
[root@proxynode tomcat]# rm -f a
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls test >a 2>&1   //看最终2>&1组合,输出错误信息
[root@proxynode tomcat]# cat a
ls: cannot access test: No such file or directory
[root@proxynode tomcat]#
[root@proxynode tomcat]# rm -f a
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls >a 2>&1   //看最终2>&1组合,输出正确信息
[root@proxynode tomcat]# cat a  //通过这两个组合可以看出来,加上2>&1后,不管是正确信息还是错误信息,都被重定向到了a中,跟我们上面解释的概念一样
a
readme.txt
tomcat.tar.gz
[root@proxynode tomcat]#

最后简单再说明一下整个过程,例如这个命令

以下面这个命令为例 
yum install -y MariaDB-Galera-server >/dev/null 2>&1

执行前一部分yum install -y MariaDB-Galera-server的时候,会把结果输出到控制台
后面到了>/dev/null之后,即1>/dev/null,把标准输出的结果重定向到了/dev/null中丢弃了
在执行到后一段2>&1时,2和1也合并了,上面1已经丢弃了这样2的异常信息也就跟丢弃了,控制台上不会显示任何结果

最后贴个Linux输入输出重定向的命令

command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
posted @ 2020-08-27 10:53  张艳华  阅读(2164)  评论(0编辑  收藏  举报