• 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 之间的内容作为输入。
  • 相关阅读:
    #18.2.27 codevs1098 均分纸牌
    18.2.26 codevs3143 二叉树的序遍历
    18.2.14 codevs1501 二叉树最大宽度和高度
    18.2.14 codevs1011 数的计算
    18.2.14 【水】codevs1475 m进制转十进制
    18.2.14 【水】codevs1474 十进制转m进制
    18.2.14 【水】codevs1430 素数判定
    18.2.13 codevs1212 最大公约数
    18.2.13 codevs1012 最大公约数和最小公倍数问题
    17.12.31 链表合并
  • 原文地址:https://www.cnblogs.com/yanh0606/p/13570125.html
Copyright © 2020-2023  润新知