我正在尝试重定向和管道,但不了解某些行为。我有这个代码片段,分别在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)
为什么最后一个命令将两个流合并?还是发生了什么事情让我伤脑筋?
答案 0 :(得分:4)
因为第二个wc -l
从当前命令派生stdout
(stdout已经重定向到拳头wc -l
),所以它的输出也传递到第一个wc -l
。
IN +-----------+ 1> +---------+ OUT
+-+--->echo stdout+----+----> wc -l +------------->
| +-----------+ ^ +---------+
| |
| |
| +<------------------+
| |
| |
| +-----------+ 2> +---------+ |
+--->echo stderr+---------> wc -l +----+
+-----------+ +---------+