我可以将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)
答案 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