2011-11-14 11 views
10

stderrを複数の出力にリダイレクトする方法を知りました。このスクリプトで試してみましたが、うまく動作するようにはできませんでした。最初のファイルはstdoutとstderrの両方を持つ必要があり、2番目のファイルはエラーだけを持つべきです。stdout/stderrを複数のファイルにリダイレクトする

perl script.pl &> errorTestnormal.out &2> errorTest.out 

これを行うより良い方法はありますか?どんな助けでも大歓迎です。ありがとうございました。

+0

追加したタグにカーソルを置き、stdout/stderr = 7のフォロワーを合計します。あなたが使用しているシェルのタグをbashに含めると、あなたの問題をより詳しく知ることができます。がんばろう。 – shellter

答えて

16

perl script.pl 2>&1 >errorTestnormal.out | tee -a errorTestnormal.out > errorTest.out

は、あなたがやりたいだろう。

これはちょっと混乱しており、ステップバイステップで行くことができます。

  • は、我々は今、我々は今errorTestnormal.outに行く何STDOUTに行くために使用されると言うSTDOUT
  • を行く何STDERRに行くために使用されると言います。

だから今、STDOUTはファイルに出力されます、そしてSTDERRSTDOUTに印刷されます。我々はSTDERRを2つの異なるファイルに入れたいと思っています。 teeはファイルに与えられたテキストを追加し、さらにSTDOUTにエコーします。

  • 我々はerrorTestnormal.outに追加するteeを使用し、それは今script.plのすべてSTDOUTSTDERR出力が含まれています。
  • はその後、我々はerrorTestnormal.outは、すべてのSTDERR出力をすべてSTDOUT出力を持ち、そして、この後errorTest.out

に(script.plからSTDERRを含む)teeSTDOUT書きます。 errotTest.outには、STDERR出力のみが含まれています。

+1

あなたは学者で紳士です。ファンタスティックな答え、そして多くの感謝:) – kevin948

+2

fdを使う必要はありません3。あなたは単純にすることができます:perl script.pl 2>&1> errorTestnormal.out | tee ...最初のリダイレクトはfd 2(stderr)をパイプに関連付け、2番目のリダイレクトはstdoutをファイルにリダイレクトします。次のようにします:perl script.pl> errorTestnormal.out 2>&1の場合、stderrとstdoutの両方がファイルに移動します。 –

+0

良いキャッチ、それを修正しました。 – Jarek

0

2番目の「>」の場合、errorTestnormal.outのエラー出力(script.plではない)をerrorTest.outに送信しようとします。

2

私はしばらくの間これを使いこなす必要がありました。両方のファイルでstderrを取得するには、stdoutを単一のファイルに入れるだけです(例えば、stderrをerrors.logとoutput.logに入れ、stdoutをoutput.logに入れて)あなたがstdoutとstderrはまだ画面上に出力されるようにしたい場合は

((sh test.sh 2>&1 1>&3 | tee errors.log) 3>&1 | tee output.log) > /dev/null 2>&1 

最後の/ dev/NUL 2> & 1を省略することができます。

関連する問題