说明此bash重定向行为

时间:2018-08-21 03:38:08

标签: linux bash pipe io-redirection

我正在尝试重定向和管道,但不了解某些行为。我有这个代码片段,分别在stderr和stdout上生成一行:

(echo stdout; echo stderr 1>&2)

它似乎正常工作(尝试> / devnull和2> / dev / null)。

但是这三个命令的行为使我感到困惑:

(echo stdout; echo stderr 1>&2) > >(wc -l)
stderr
1
(echo stdout; echo stderr 1>&2) 2> >(wc -l)
stdout
1
(echo stdout; echo stderr 1>&2) > >(wc -l) 2> >(wc -l)
2
(empty)

为什么最后一个命令将两个流合并?还是发生了什么事情让我伤脑筋?

1 个答案:

答案 0 :(得分:4)

因为第二个wc -l从当前命令派生stdout(stdout已经重定向到拳头wc -l),所以它的输出也传递到第一个wc -l

 IN   +-----------+   1>    +---------+         OUT
+-+--->echo stdout+----+---->  wc -l  +------------->
  |   +-----------+    ^    +---------+
  |                    |
  |                    |
  |                    +<------------------+
  |                                        |
  |                                        |
  |   +-----------+   2>    +---------+    |
  +--->echo stderr+--------->  wc -l  +----+
      +-----------+         +---------+