キャプチャしたいメッセージをstderrに書き込み、それを適切にリダイレクトしてみませんか? 考慮すべき点の 1 つは、stdoutは [通常] バッファリングされ、stderrはバッファリングされないことです。
シェルのリダイレクトとパイピングを探しています。shell、bash、cshなどの標準的なシェルを使用していると仮定します...
command >foo.txt
stdoutを fileにリダイレクト します。塗りつぶしの既存のコンテンツはすべて置き換えられます。foo.txt
command >>foo.txt
はstdoutをリダイレクト し、それを既存のコンテンツ (存在する場合)のファイルに追加します。foo.txt
foot.txt
foo | bar
commandのコンテンツを commandのstdinにパイプします。foo
stdout
bar
*nix プロセスには、次の 3 つの標準 I/O ハンドルが開いています。
- stdinは標準入力です。ファイルハンドル0です。
- stdoutは標準出力です。ファイルハンドル 1 です。
- stderrは標準エラーです。ファイルハンドル2です。
リダイレクトおよびパイプ オペレーターは、特定のファイル ハンドルをフックすることもできます。そう...
command >foo.txt 2>&1
次のことを行います。
- 標準出力をファイルにリダイレクトします
foo.txt
- stderrをファイル ハンドル 1 のstderrにリダイレクトします。これは現在 として開かれてい
foo.txt
ます。
他のシェルは、異なるが、一般的に類似した構文を使用できます (実際に使用します)。
いくつかの便利なコマンドについても学ぶ必要があります。
tee(1)
.
これは、与えられた stdin を受け取り、それをコマンドラインで指定されたファイルと stdout に書き込むため、次のようなチェーンになります。
some-command 2>&1 | tee some-command.log.2013-05-31.txt | less
これはsome-command
おそらくかなりの量の出力を生成し、stderr を stdout にリダイレクトし、それを にパイプtee(1)
してログファイルを生成し、それをsome-commmand.log.2013-05-31.txt
パイプless(1)
してコンソールにページングします。
less(1)
more(1)
more
less(1)
通常、これらの日の同義語です。これらはどちらも、出力をバッファリングして一度に 1 画面ずつ表示するページャであり、ページを前後に移動できます。
man(1)
apropos(1)
これは *nix のオンライン ヘルプ システムです。それらについて詳しく知るには、次のコマンドを実行してみてください。
* `man man`
* `man apropos`
およびコマンドのマニュアル ページを取得します。または、使用している特定のシェルについても試してみてください(たとえば、シェルのマニュアル ページが表示され、は Bourne シェル ( ) のマニュアル ページが表示され、マニュアル ページが表示されます。man
apropos
man tee
man [your-shell-name]
man csh
csh
man sh
sh
man bash
bash
このページでは、C および Bourne シェル ファミリの通常のパイピング/リダイレクト演算子について説明します: http://www.mathinfo.u-picardie.fr/asch/f/MeCS/courseware/users/help/general/unix/redirection.html
Nutshell
適切な O'Reillyの本も読む必要があります。
注:
以下のコメントで述べたように、次の行に沿ってSystem.Out
andSystem.Err
を独自のものに置き換えることができます。PrintStream
PrintStream originalStdOut = System.Out ;
PrintStream newStdout = CreateNewOutputSink() ;
System.Out.flush() ;
System.Out.setOut( newStdout ) ;
invokeSome3rdPartyCode() ;
System.Out.flush() ;
System.Out.setOut( originalStdout ) ;
これにより、通常の出力に影響を与えずに、サードパーティ ライブラリからの出力をフックして、選択したデータ シンクにリダイレクトできます。System.Out
両方をフックして同じSystem.Err
ものにリダイレクトすると、プロセスで標準出力とエラー出力の両方がキャッチされます。 PrintStream