Emacsユーザーの皆さん、こんにちは
私は「Ubuntu 10.04.1 LTS」で GNU Emacs 23.1.1 を実行していますが、標準の Linux カーネル ソース コード (vanilla) で組み込みの Mx rgrep を使用して実行する検索はすべて途中で終了し、emacs エコー領域に次のエラーが表示されます。
Grep exited abnormally with code 123
私はしばらくの間、Redhat システムや他の (大規模な) コード ベースでもこれを見てきました。これを見たことがある人、あるいはもっと良い方法で解決した人はいますか?
ありがとう!
編集: 私には分からない理由で、StackExchange では下のコメントを編集できないので、ここで更新します。
以下のコメントに従って、emacsシェルバッファでrgrepが実行するのと同じコマンドを実行しようとしました。
find . \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS -o -path \*/.svn -o -path \*/.git
-o -path \*/.hg -o -path \*/.bzr -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) -prune -o -type f \( -name \*.\[ch\] \) -p
rint0 | xargs -0 -e grep -i -nH -e v4l_compat_ioctl32
エラーは出力されませんが、終了コードを調べると、同じ 123 が再度表示されます。
/home/mcradle/linux> echo $?
123
ジルのコメントに従って、私は実行しようとしました
/home/mcradle/linux> find . -type f \( -name \*.\[ch\] \) -exec grep -i -nH -e v4l_compat_ioctl32 '{}' \;
これは機能的にはfindとxargsの組み合わせと同等であり、終了コード0で完了しました。
/home/mcradle/linux> echo $?
0
つまり、xargs に問題があるようです。
答え1
xargs 終了コードのドキュメントを見ると:
123 if any invocation of the command exited with status 1-125
しかし、grepのドキュメントによると、1はgrepがパターンに一致しなかった場合の終了ステータスです。
EXIT STATUS
Normally, the exit status is 0 if selected lines are found and 1 otherwise.
したがって、emacsが「rgrep」検索を発行するために使用するコマンドラインは常に123を返すように思われ、このエラーは抑制するか、次のようなコマンドラインに置き換える必要があります。
find . -type f \( -name \*.\[ch\] \) -exec grep -i -nH -e v4l
答え2
バージョン管理システムが使用するディレクトリを無視して、C .c および .h ファイルの束に対して再帰 grep を実行しようとしているようです。ack が必要です。翻訳:
ack で実行している操作とまったく同じ操作を実行するコマンド:
ack --cc -i v4l_compat_ioctl32
-r、-n、-H の効果は ack で想定されます。-i は大文字と小文字を区別せず、--cc は「*.c および *.h ファイルのみを検索する」と示します。
find は必要ありません。xargs も必要ありません。外部モジュールのない、インストールされた Perl のバージョンと単一の Perl プログラムだけです。