2017-02-27 53 views
3

我想创建一个基本上将STDERR重定向到STDOUT的函数。 我熟悉重定向当它涉及到执行命令,如:捕捉任何STDERR数据的函数

$ echo "all to out" >&2 
all to out 
$ echo "all to err" >&2 
all to err 
$ echo "err to out" 2>&1 
err to out 
$ echo "out to err" 1>&2 
out to err 

但我想要做的,就是写一个可以用来重定向的所有数据,以前的命令发送功能到stderr。事情是这样的:

$ echo -e "foo\nbar\nbaz\nquux" 1>&2 | COMMAND_HERE | grep bar 
bar 

我打算有这样的功能,但它应该是一样容易使用通过直接在命令行功能的源(的作品)。

这里有几件事情我已经试过,没有哪个工作:

$ function 2to1 { exec 2>&1; } 
$ echo -e "foo\nbar\nbaz\nquux" 1>&2 | 2to1 | grep bar 
foo 
bar 
baz 
quux 
$ echo -e "foo\nbar\nbaz\nquux" 1>&2 | tee >(cat 2>&1) | grep bar 
foo 
bar 
baz 
quux 

如果2to功能或tee命令工作就像我想它,然后输出只会

一对夫妇的文章/线程我发现有些暗示,除非我惹重定向被执行的命令之前,我不会执行命令(意思的数据是命令后能够看到stderr正在管道)

任何输入将不胜感激 - 谢谢!

回答

1

由于只有stdout被重定向到管道,因此无法使用普通管道完成。

您可以使用process substitution,指定要将stderr重定向到2>(...)的过程。

echo -e "foo\nbar\nbaz\nquux" 2>(2to1 | grep bar) 1>&2 
1

你不能在管道中做。需要按照echo的顺序调用2to1,就像直接调用exec一样。你不要管道exec,你先打电话吧。

$ 2to1() { exec 2>&1; } 
$ { 2to1; echo -e "foo\nbar\nbaz\nquux" 1>&2; } | grep bar 
bar