在 emacs 上运行 rgrep 时,Grep 异常退出,代码为 123

在 emacs 上运行 rgrep 时,Grep 异常退出,代码为 123

大家好,Emacsers

我在“Ubuntu 10.04.1 LTS”上运行 GNU Emacs 23.1.1,并且我在标准 Linux 内核源代码(vanilla)上使用内置 Mx rgrep 执行的任何搜索都会过早结束,并在 emacs 回显区域打印以下错误:

Grep exited abnormally with code 123

我也在 Redhat 系统上看到过这种情况,在其他(大型)代码库中也有这种情况,有人见过或者更好地治愈过它吗?

谢谢!

编辑:由于超出我能力范围的原因,stackexchange 不允许我编辑下面的评论,因此我将在这里更新。

根据下面的评论,我尝试运行 rgrep 在 emacs shell 缓冲区中运行的相同命令

 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

根据 Gilles 的评论,我尝试运行

/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 文档,如果 grep 与模式不匹配,则退出状态为 1

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。请参阅http://betterthangrep.com/

在 ack 中执行的操作与你完全相同的命令:

ack --cc -i v4l_compat_ioctl32

ack 中假定了 -r、-n 和 -H 的效果。-i 仍然不区分大小写,--cc 表示“仅搜索 *.c 和 *.h 文件”

无需 find。无需 xargs。只需安装一个 Perl 版本和一个单独的 Perl 程序,无需任何外部模块。

相关内容