大里です。 # 今日はこんなネタがあったのか:) # 乗り遅れですが。 > From: y_shiro@xxxxxxxxxxxxxxxx > Subject: [vine-users:068976] Re: grepで上書きエラー > Date: Tue, 30 Nov 2004 13:34:17 +0900 > 実際に、a、bのファイルを作成して試してみました。 > $ grep test * > c > $ grep test * > c > a、bの二つだけだとcには > a、bの結果のみ出力されてcの結果はありませんでした。これは二番目のgrepを > 起動したときにcのサイズが0となるためですね。grep test cの処理は行なわれる > がサイズ0のため、結果もなしと。 > > > また、grepの出力はバッファリングされず、grep が出力したものはすぐにcに > > 出力されるものとします。 ← ここが肝です。 > > もしa、bにtestと記述されている行がgrepのバッファ以上に大きければ、 > 1) cにa、bの結果がバッファを溢れて反映 > ↓ > 2) grep test で cが検索対象となる(cには、すでにバッファ以上の内容が入っている) > ↓ > 3) cにc自身の結果が追記 > ↓ > 4) cに追記された内容がさらにgrepが検索、バッファを溢れcに追記 > ↓ > 以後3)と4)の繰り返しで処理が終わらない ふむふむ、c の読み込み処理に入ったときに、その前のファイルの grep で c に書きこまれているデータのサイズがファイルシステムの ブロックサイズ(4kB)を超えているかどうかが、終了とループの分かれ 目になりそうですね。 c の最初の読み込みで EOF を検出できないから close せずに処理 して書き込みを行なう。このケースでは c に書きこまれているデー タは全件マッチするから、もう永遠に EOF には追いつけない。 これが 4kB 以内に EOF がみつかれば無事終了。 $ grep X-Miler [1-9]* > x-mailer.txt で無問題なんですけどね。 -- kazz