现在的位置: 首页 > 综合 > 正文

/dev/null 2>&1 详解

2018年01月22日 ⁄ 综合 ⁄ 共 2224字 ⁄ 字号 评论关闭
      今天一个朋友突然在自己的维护的Linux中, /var/spool/cron/root 中看到了以下的内容:
30 19 * * * /usr/bin/**dcon.sh > /dev/null 2>&1
59 23 * * 1-7 /home/s**-log/squid-log.renew > /dev/null 2>&1

50 1 * * 1-7 /usr/local/src/**log.sh > /dev/null 2>&1
20 2 * * 1-7 /home/sq**-log/**log > /dev/null 2>&1
30 2 * * 1-7 /home/sq**-log/**log.01

30 22 * * * /bin/**sync > /dev/null 2>&1
00 8 * * 1-7 /home/**-log/rmcore > /dev/null 2>&1
00 16 * * 1-7 /home/**-log/rmcore > /dev/null 2>&1

他问我为什么要用 /dev/null 2>&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.下面我就为大家来说一下, command > file 2>file  与command
> file 2>&1
 有什么不同的地方.
      首先~command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command  > file 2>file 这样的写法,stdoutstderr都直接送到file中,
file会被打开两次,这样stdoutstderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道.
      而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file
只被打开了一次,也只使用了一个管道FD1,它包括了stdoutstderr的内容.
      从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法.

本文出自 “石头西的Linux博客” 博客,请务必保留此出处http://viplin.blog.51cto.com/241472/99568

另外:

经常关注linux脚本的人,一定看到过 2>&1 这样的用法,最初一定不明白其中的含义以及为什么是这样的一种组合。昨天偶然间再次看到了这个 2>&1 的写法,遂下决心搞明白其中的含义。
    其实要弄清楚 2>&1 的含义,首先应当知道linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2。STDIN就是标准输入,默认从键盘读取信息;STDOUT是标准输出,默认将输出结果输出至终端,也就是显示器之类的东西;STDERR是标准的错误信息,默认也会显示在终端上。由于STDOUT与STDERR都会默认显示在终端上,为了区分二者的信息,就有了编号的0,1,2的定义,用1表示STDOUT,2表示STDERR。
    下面举个例子:以rhce中的例子为例。
    1、在系统中创建一个普通用户test;
    2、以普通用户登录,或者以root登录 su -test 切换至普通用户test;
    3、执行 find /etc -name passwd 命令,默认会将命令的执行结果(STDOUT)与错误信息(STDERR)都输出至终端显示器。
    4、体验一下编号1,2的作用,find /etc -name passwd >find.out 2>find.err,这里会将STDOUT与STDERR分别存放至find.out和find.err中,该命令也可以写成下面三种形式,大家可以体会一下编号的意义。
    find /etc -name passwd 1>find.out 2>find.err
    find /etc -name passwd 2>find.err >find.out
    find /etc -name passwd 2>find.err 1>find.out
    我个人理解就是find /etc -name passwd的命令的执行结果输出正确的输出(STDOUT)被1接收,错误的信息(STDERR)被2接收。
    5、若要将所有的输出及错误信息都显示出来,可以用&表示全部1和2的信息,例如:
    find /etc -name passwd &>find.all
    6、有时候希望将错误的信息重新定向到输出,就是将2的结果重定向至1中就有了"2>1"这样的思路,如果按照上面的写法,系统会默认将错误的信息(STDERR)2重定向到一个名字为1的文件中,而非所想的(STDOUT)中。因此需要加&进行区分。就有了 2>&1 这样的用法,举例:
    find /etc -name passwd 2>&1 |less
    7、有时候还能看到这样的用法:
    find /etc -name passwd &2>&1 |less
    这里可以分解成
    find /etc -name passwd &    表示前面的命令放到后台执行。
    2>&1 |less    表示将错误信息重定向至标准输出,并用less进行分页显示。

from :http://blog.chinaunix.net/uid-776154-id-2560965.html

抱歉!评论已关闭.