2017-02-27 72 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