Linux中21的含义
平时写shell脚本时经常见到命令或者定时任务的后⾯跟着2>&1的写法,举个例⼦⼤概如下⾯这样
定时任务中
0 */1 * * *  root /bin/sh /opt/log_clear.sh >/dev/null2>&1
普通shell脚本中
yum install -y MariaDB-Galera-server MariaDB-client rsync >install.log 2>&1
echo'net.ipv4.ip_forward = 1' >>/f >/dev/null2>&1
这个 /dev/null 不⽤多说了,相当于⼀个⿊洞,Linux的所有数据进去后都会被直接丢弃,从⾥⾯读也不会读出任何数据,如果希望执⾏某个命令,但⼜不希望在屏幕上显⽰输出结果,那么可以将输出重定向到 /dev/null
解释后⾯的2>&1的之前,先说Linux的三个输⼊输出标准,0 通常指标准输⼊(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR),上⾯2>&1中的2和1就是分别对应着标准错误输出(ST
DERR)和标准输出(STDOUT),⽽ >& 是⼀个符号,不能拆开,意思是合并两个输出⽂件,所以2>&1的含义就是将标准错误输出合并到标准输出
举个例⼦验证⼀下
[root@proxynode tomcat]# ls//⽬录下原来有两个⽂件
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls >a    //查询⽂件将结果重定向到a⾥⾯,下⾯命令可以看到a⾥⾯有正确的内容
[root@proxynode tomcat]# cat a
a
重定向过多是什么意思
<
[root@proxynode tomcat]# rm -f a
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls1>a  //这⾥可以看到加了1和上⾯不加1效果⼀样,因为这⾥1就是标准输出的意思
[root@proxynode tomcat]# cat a
a
<
[root@proxynode tomcat]# rm -f a
[root@proxynode tomcat]#
[root@proxynode tomcat]# ls2>a  //将错误重定向到a⾥⾯,可以看到a是空的,因为没有错误信息,标准信息没指定直接输出到控制台了
a   
[root@proxynode tomcat]#
[root@proxynode tomcat]# cat a
[root@proxynode tomcat]#
再来看关于错误输出的和最终组合的结果
[root@proxynode tomcat]# ls
[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
<
[root@proxynode tomcat]#
最后简单再说明⼀下整个过程,例如这个命令
以下⾯这个命令为例
yum install -y MariaDB-Galera-server >/dev/null2>&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 之间的内容作为输⼊。

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