平时写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 之间的内容作为输入。 |