混淆输出重定向到2>& 1?

时间:2013-12-10 12:02:56

标签: linux bash shell ksh

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

不幸的是到目前为止还没有完全了解它。

我知道2是stderr,1是标准输出,我们正在与2>& 1结合。

但我的问题是:

之间的区别
1. mycommand > /dev/null       
2. mycommand 2> /dev/null      
3. mycommand > /dev/null 2>&1  

我在想:

  1. 会将stdout和stderr重定向到/ dev / null
  2. 会将stderr重定向到/ dev / null
  3. 会将stdout和stderr重定向到/ dev / null
  4. 相关帖子:

4 个答案:

答案 0 :(得分:13)

见:

<强> 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。结果是   你现在在stdout和stdout上得到了孩子的stderr输出   转到文件。这对于处理管道中的stderr非常有用   例。 (见answer

答案 1 :(得分:4)

(错误文件不存在)

$ 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

答案 2 :(得分:3)

尝试这些来获得差异:

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

这两个命令都重定向到/dev/null,但在第一个命令中我们写入stderr打印stderr但在第二个打印stderr

答案 3 :(得分:0)

1:将STDOUT重定向到/ dev / null,在这种情况下使用默认文件描述符,例如命令[默认]&gt; filename,默认文件描述符是STDOUT。

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

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

希望这些提示能让你清楚。

0,1,2 ... 9是bash中的文件描述符。 0代表stdin,1代表stdout,2代表stderror。任何其他临时使用都可以使用3~9。

可以使用运算符&gt;将任何文件描述符重定向到其他文件描述符或文件。或&gt;&gt;(追加)。

用法:&gt;

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