Grep аварийно завершает работу с кодом 123 при запуске rgrep в emacs

Grep аварийно завершает работу с кодом 123 при запуске rgrep в emacs

Приветствую вас, товарищи Emacsers!

Я использую GNU Emacs 23.1.1 на «Ubuntu 10.04.1 LTS», и любой поиск, который я выполняю с помощью встроенной команды Mx rgrep в исходном коде стандартного ядра Linux (vanilla), преждевременно завершается со следующей ошибкой, выводимой в эхо-область emacs:

Grep exited abnormally with code 123

Я уже некоторое время наблюдаю это в системах Redhat и в других (больших) кодовых базах. Кто-нибудь видел или даже лучше исправил это?

Спасибо!

Редактировать: по независящим от меня причинам stackexchange не позволяет мне редактировать мой комментарий ниже, поэтому я обновлю его здесь.

следуя комментарию ниже, я попытался запустить ту же команду, которую rgrep запускает в буфере оболочки emacs

 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

Похоже, вы пытаетесь выполнить рекурсивный grep через кучу файлов C .c и .h, игнорируя каталоги, используемые системами контроля версий. Вам нужен ack. Смотритеhttp://betterthangrep.com/

Команда, которая делает именно то, что вы делаете, в ack:

ack --cc -i v4l_compat_ioctl32

Эффекты -r, -n и -H предполагаются в ack. -i по-прежнему нечувствителен к регистру, а --cc говорит "Искать только файлы *.c и *.h"

Не нужен find. Не нужен xargs. Просто установленная версия Perl и одна программа Perl, без внешних модулей.

Связанный контент