如何让bash将stderr重定向到>(命令替换)?

时间:2016-07-07 08:33:17

标签: bash redirect

我可以将stdout重定向到命令重定向:

$ ( echo stdout ; >&2 echo stderr  ) > >( rev )
stderr
tuodts

但是当我尝试将stderr重定向到另一个时,它似乎通过stdout频道:

$ ( echo stdout ; >&2 echo stderr  ) > >( rev ) 2> >( cat )
tuodts
rredts

我不能使用管道,因为我想保持处理严格分开:

$ ( echo stdout ; >&2 echo stderr ) 2> >(rev)
stdout
rredts

这确实很奇怪:

$ ( echo stdout ; >&2 echo stderr ) 2> >(rev) | cat -n
 1  stdout
 2  rredts

我是否误解了这应该如何运作?

(我的实际目标是让stdout和stderr经历两个不同的T恤流程,同时为现有的消费流程保持明显的stderr和stdout。)

GNU bash,版本3.2.57(1)-release-(x86_64-apple-darwin15)

1 个答案:

答案 0 :(得分:3)

进行重定向时,订单很重要。

您需要撤销订单:

$ ( echo stdout ; >&2 echo stderr  ) 2> >( cat ) > >( rev )
stderr
tuodts

讨论

考虑原始代码:

$ ( echo stdout ; >&2 echo stderr  ) > >( rev ) 2> >( cat )
tuodts
rredts

stderr确实传递给cat ,但 cat将其输出发送到stdout,stdout将已经重定向到{{1} }。因此,stdout和stderr最终都会转到rev

如果我们颠倒顺序(如上所述),rev会将输出发送到终端,因为stdout尚未 重定向。

替代

这是保持stderr不被cat捕获的另一种方法:

rev