プロが教える店舗&オフィスのセキュリティ対策術

例として、perlなどで、(test.plとします)
 print "stdout1\n";
 print STDERR "STDERR1\n";
 print "stdout2\n";
 print STDERR "STDERR2\n";
 print "stdout3\n";
 print STDERR "STDERR3\n";
このように、標準出力と、標準エラー出力が混在した状態の処理があった場合、

コマンドプロンプト(Windows2000)にて、
C:\>test.pl
とすると、
stdout1
STDERR1
stdout2
STDERR2
stdout3
STDERR3
のように時系列に出力されますが、これをログファイルに取ろうとして、
C:\>test.pl 1>log.txt 2>&1
とすると、
C:\>cat log.txt
STDERR1
STDERR2
STDERR3
stdout1
stdout2
stdout3
のように、標準エラー出力が先に吐き出されてしまいます。

これを画面出力時と同様に時系列で取れるようにしたいのですが、どのようにすれば良いでしょうか?
単純なことで困っています。よろしくお願いします。

A 回答 (2件)

出力のバッファリングを解除すれば時系列で出力されます。



perlなら、printする前に

$| = 1;

とすればバッファリングされなくなります。

C言語ならsetbuf関数を使います。

その他の言語でも、"バッファリング"で検索をかければ解決策がいろいろ出てくると思います。

この回答への補足

ありがとうございました。
質問の文が良くなかったのですが、
標準出力と標準エラー出力を交互に履いているのは、
例に示したtest.plのような明示的なバッチファイルではなく、
バイナリのexeツールでした。

C:\>hoge.exe 1> log.txt 2>1&
が上手く行かない。

「バッファリング」でgoogleって探してみましたが、今一つ見つけられませんでした。
MS-DOSとして、バッチ処理前にバッファリングをOFFにする方法などは無いでしょうか。よろしくお願いします。

補足日時:2006/01/25 20:27
    • good
    • 0

DOSプロンプトからプログラム出力のバッファリングを制御できる機能はないように思われます。


標準出力も標準エラー出力もコンソール以外のハンドルにリダイレクトすると、
出力内容がいったん一時ファイルに保存されてからリダイレクト先と結合するようなので
標準エラーを標準出力にリダイレクトしても時系列どおりに保存されないようです。
いろいろとパラメータを変えて試してみましたが駄目でした。

このカテゴリーよりも、技術者向けのカテゴリー
(コンピューター [技術者向け] > OS > Windows系OS か その他OS)で
質問しなおせば、もしかしたら解決につながる回答が得られるかもしれません。

お役に立てずすみません。
    • good
    • 0
この回答へのお礼

twinkleluzさん、わざわざ調査までして頂いて、感謝いたします。
私のほうでも、UNIX-like tools からtee(.exe)を持ってきて、
>hoge.exe 2>1 | tee -a log.txt
なども試してみましたが、やはり駄目でした。
画面には時系列に表示されても、ファイルへ書き込みさせると上手くいかないようです。
アドバイス頂いた通り、一度、この質問を閉じさせて頂いて、別コーナーで質問させて頂こうと思います。

取り急ぎ、お礼まで。ありがとうございました。

お礼日時:2006/01/26 22:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!