大家好,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 程序,无需任何外部模块。