混淆输出redirect到2>&1?

我已经检查了几个相关的post关于这个在stackoverflow和其他来源有关使用2>&1。

不幸的是到目前为止还没有完全解决我的问题。

我知道2是stderr,1是stdout,我们正在和2&1结合。

但我的问题是有什么区别:

1. mycommand > /dev/null 2. mycommand 2> /dev/null 3. mycommand > /dev/null 2>&1 

我刚在想:

  1. 会将stdout和stderrredirect到/ dev / null
  2. 会将stderrredirect到/ dev / null
  3. 会将stdout和stderrredirect到/ dev / null

相关post:

  • 在/ shell命令末尾,“/ dev / null”是什么意思 )

  • 在Linux shell上的I / Ostreamredirect。 shell如何通过redirect来处理命令?

  • “/ dev / null 2>&1”是什么意思? ( http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ )

看到这个:

mycommand > /dev/null

它会将mycommand的通道1(stdout)重定向到/ dev / null

mycommand 2> /dev/null

它会将通道2(stderr)重定向到/ dev / null

mycommand > /dev/null 2>&1

它会将通道1重定向到/ dev / null,然后将通道2(stderr)绑定到通道1(stdout)。 两者都将进入/ dev / null

还有一个(只是为了完成)

mycommand 2>&1 > /dev/null

在第二种情况下,我将(孩子的)stderr绑定到父级的stdout,然后找到孩子的stdout为/ dev / null。 结果是,你现在得到了标准输出的孩子的stderr输出和标准输出到文件。 例如,这对于处理管道中的标准错误很有用。 (看这个答案 )

(errfile不存在)

 $ cat errfile cat: 0652-050 Cannot open errfile. $ cat errfile > /tmp/stream.out cat: 0652-050 Cannot open errfile. $ cat errfile > /tmp/stream.out 2>&1 $ cat /tmp/stream.out cat: 0652-050 Cannot open errfile. ($ rm /tmp/stream.out) $ cat errfile 2>&1 > /tmp/stream.out cat: 0652-050 Cannot open errfile. $ cat /tmp/stream.out $ 

因此,在shell解释中,由于流重定向,顺序是重要的, 2>&1 1>out1>out 2>&1不同。 你应该以“反向”顺序重定向。 stdout > finalsource > stdout

试试这些来获得差异:

 echo "stderr" > /dev/fd/2 | >/dev/null stderr echo "stdout" > /dev/fd/1 | >/dev/null 

这两个命令重定向到/dev/null但在第一个我们正在写信给标准错误打印stderr,但在第二个它不打印什么

1:将STDOUT重定向到/ dev / null,在这种情况下使用默认的文件描述符,例如command [default]> filename,默认的文件描述符是STDOUT。

2:将STDERR重定向到/ dev / null

3:将STDOUT重定向到/ dev / null并将STDERROR重定向到STDOUT,这意味着STDOUT和STDERROR都将被重定向到/ dev / null

希望提示能够让你清楚。

0,1,2 … 9是bash中的文件描述符。 0代表stdin,1代表标准输出,2代表stderror。 3〜9用于其他临时使用。

任何文件描述符可以通过运算符>或>>(附加)重定向到其他文件描述符或文件。

用法:>

请参考http://www.tldp.org/LDP/abs/html/io-redirection.html