- 締切済み
標準出力と標準エラー出力を時系列にファイルへ
例として、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 のように、標準エラー出力が先に吐き出されてしまいます。 これを画面出力時と同様に時系列で取れるようにしたいのですが、どのようにすれば良いでしょうか? 単純なことで困っています。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- twinkleluz
- ベストアンサー率52% (98/185)
DOSプロンプトからプログラム出力のバッファリングを制御できる機能はないように思われます。 標準出力も標準エラー出力もコンソール以外のハンドルにリダイレクトすると、 出力内容がいったん一時ファイルに保存されてからリダイレクト先と結合するようなので 標準エラーを標準出力にリダイレクトしても時系列どおりに保存されないようです。 いろいろとパラメータを変えて試してみましたが駄目でした。 このカテゴリーよりも、技術者向けのカテゴリー (コンピューター [技術者向け] > OS > Windows系OS か その他OS)で 質問しなおせば、もしかしたら解決につながる回答が得られるかもしれません。 お役に立てずすみません。
- twinkleluz
- ベストアンサー率52% (98/185)
出力のバッファリングを解除すれば時系列で出力されます。 perlなら、printする前に $| = 1; とすればバッファリングされなくなります。 C言語ならsetbuf関数を使います。 その他の言語でも、"バッファリング"で検索をかければ解決策がいろいろ出てくると思います。
補足
ありがとうございました。 質問の文が良くなかったのですが、 標準出力と標準エラー出力を交互に履いているのは、 例に示したtest.plのような明示的なバッチファイルではなく、 バイナリのexeツールでした。 C:\>hoge.exe 1> log.txt 2>1& が上手く行かない。 「バッファリング」でgoogleって探してみましたが、今一つ見つけられませんでした。 MS-DOSとして、バッチ処理前にバッファリングをOFFにする方法などは無いでしょうか。よろしくお願いします。
お礼
twinkleluzさん、わざわざ調査までして頂いて、感謝いたします。 私のほうでも、UNIX-like tools からtee(.exe)を持ってきて、 >hoge.exe 2>1 | tee -a log.txt なども試してみましたが、やはり駄目でした。 画面には時系列に表示されても、ファイルへ書き込みさせると上手くいかないようです。 アドバイス頂いた通り、一度、この質問を閉じさせて頂いて、別コーナーで質問させて頂こうと思います。 取り急ぎ、お礼まで。ありがとうございました。