2016-08-17 11 views
0

私はこの質問のバリエーションが質問されており、答えはseveral times beforeだと知っていますが、私は解決策を誤解しているか、または偏心して何かをしようとしています。私の本能は、それがteeを要求すべきではないということですが、多分私は完全に間違っている...このようなコマンドを考えるとBash:出力をstderrとstdoutの両方に送り、別のコマンドにパイプする方法は?

:私はそれをログに記録することができるようにSTDERRにそれを送りたい

sh 
echo "hello" 

/コンソールに表示されているを別のコマンドに送ることができます。例えば、私が実行した場合:

sh 
echo "hello" SOLUTION>&2 > myfile.txt 

は、私が欲しい(SOLUTION>は私の問題への答えは何でもある):

  • helloは、他のSTDERRメッセージなどのコンソールに表示されるように
  • ファイルを含むmyfile.txthello
+0

AFAIK、bashストリームリダイレクトはストリームを複製できません。それは 'ティーの存在の全体のポイントです。そして私が見る限り、あなたの質問はhttps://stackoverflow.com/q/3141738の正確な複製です。 – Siguza

答えて

3

stderrにリダイレクトする必要はありません。 を使用してファイルに送信し、stdoutに送信すると、端末に送信されます。ファイルに書き込むことなく、

echo "hello" | tee myfile.txt 

あなたはパイプに別のコマンドに出力したい場合は、あなたはまた、tee /dev/stderrと同等の処理を行い、シェル関数を書くことができ

echo "hello" | tee /dev/stderr | other_command 

使用することができます

$ tee_to_stderr() { 
    while read -r line; do 
     printf "%s\n" "$line"; 
     printf "%s\n" "$line" >&2 
    done 
} 

$ echo "hello" | tee_to_stderr | wc 
hello 
     1  1  6 

これはバイナリ出力ではうまく機能しませんが、これを使用して端末に問題ではないテキストを表示する予定があるためです。

+0

ありがとう!私はこの答えのいくつかのバリエーションを見たことがありますが、すべてのシステムに '/ dev/stderr'があるわけではなく、stderrファイルディスクリプタを使ってどのように見えるか不思議でした。一方、 '/ dev/stderr'に関する普遍的な標準の欠如は私の大きな関心事ではないので、この答えはまさに私のために働きます。 –

+1

シェルには、出力を複数のfdsに複製するための組み込みのメカニズムがありません。そしてteeにはfdに直接書き込むオプションはありません。それを行うシェル関数を書くことができます。 – Barmar

1

teeは、コマンドライン上のファイルにstdinをコピーし、stdoutにもコピーします。

echo hello | tee myfile.txt >&2 

これはmyfile.txthelloを保存してもstderrにそれを印刷します。

関連する問題