我正在尝试重定向和管道,但不理解某些行为。我有这段代码可以在 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)
为什么最后一个命令会合并两个流?或者还有什么事情让我的大脑崩溃了?
最佳答案
因为第二个 wc -l
从当前命令派生 stdout
(stdout 已经重定向到第一个 wc -l
),它的输出也是传递给第一个 wc -l
。
IN +-----------+ 1> +---------+ OUT
+-+--->echo stdout+----+----> wc -l +------------->
| +-----------+ ^ +---------+
| |
| |
| +<------------------+
| |
| |
| +-----------+ 2> +---------+ |
+--->echo stderr+---------> wc -l +----+
+-----------+ +---------+
关于linux - 解释这个 bash 重定向行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51941229/