我已经检查了几个相关的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
我刚在想:
相关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>out
与1>out 2>&1
不同。 你应该以“反向”顺序重定向。 stdout > final
比source > 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用于其他临时使用。
任何文件描述符可以通过运算符>或>>(附加)重定向到其他文件描述符或文件。
用法:>