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

私は機能でこれを持っていることを計画、直接コマンドラインから(作品)関数のソースを使用して、同じように簡単にする必要があります。

ここで私が試したいくつかのことは、仕事のどれもありません:私はそれは、その後、出力のみバーになりたかったよう2to機能やteeコマンドが働いた場合

$ 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 

私が見つけたカップルの記事/スレッドが多少データがあるコマンドを意味する(コマンドが実行されます前にリダイレクトとI混乱しない限り、私はコマンドが実行されstderrを見ることができるように文句を言わないことを意味するもの

任意の入力が感謝されます - ありがとう!

答えて

1

stdoutのみがパイプにリダイレクトされるため、通常のパイプでは実行できません。

2>(...)のプロセスにリダイレクトすることを指定して、process substitutionを使用できます。

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

パイプラインで実行することはできません。 2to1は、を直接呼び出すのと同じように、echoと連続して呼び出す必要があります。 execにパイプしていない場合は、まずそれを呼び出します。

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