grep で input file 'XXXX' is also the output が出る件

grep の結果を標準出力にリダイレクトすると、以下のようなメッセージが出てくる。

$ grep -rn "todo" ./ --exclude-dir={.git} > grep_result
grep: input file './grep_result' is also the output

これは (標準出力させている)grep_result というファイル自身も grep の走査対象になっちゃってるよ という意味。

詳しく

そもそも grep は走査中に「走査対象の中身が変わらない」ことを前提としている。いわゆる 冪等性(べきとうせい) というやつで、平たく言えば「同じオプションなら何回実行しても同じ結果が得られるよね」を保証するというもの。

ところが、上記のような使い方だとこの前提が崩れる。走査対象の一つである grep_result の中身が、grep を実行する度に変化してしまうからだ。

……と思っています。ホントのところは知りません。詳しい方、いらっしゃいましたら教えてください。

解決するにはどうしたら?

Ans: 標準出力させているファイルを grep の走査対象から弾く。

もっというと --exclude オプションを使う。

$ grep -rn "todo" ./ --exclude-dir={.git} --exclude=grep_result > grep_result