Saludos compañeros de Emacs
Estoy ejecutando GNU Emacs 23.1.1 en "Ubuntu 10.04.1 LTS" y cualquier búsqueda que realice usando el Mx rgrep integrado en el código fuente estándar del kernel de Linux (vainilla) finaliza prematuramente con el siguiente error impreso en el eco de emacs área:
Grep exited abnormally with code 123
También lo he estado viendo durante un tiempo en sistemas Redhat y con otras bases de código (grandes). ¿Alguien ha visto eso o incluso lo ha solucionado mejor?
¡Gracias!
Editar: por razones ajenas a mí, stackexchange no me permite editar mi comentario a continuación, así que lo actualizaré aquí.
siguiendo el comentario a continuación, intenté ejecutar el mismo comando que ejecuta rgrep en un búfer de shell de 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
si bien no imprime ningún error, al interrogar el código de salida muestra el mismo 123 nuevamente.
/home/mcradle/linux> echo $?
123
siguiendo el comentario de Gilles, he intentado ejecutar
/home/mcradle/linux> find . -type f \( -name \*.\[ch\] \) -exec grep -i -nH -e v4l_compat_ioctl32 '{}' \;
que es funcionalmente equivalente a la combinación find y xargs y se completa con el código de salida 0
/home/mcradle/linux> echo $?
0
entonces parece ser algo con xargs.
Respuesta1
Mirando la documentación del código de salida de xargs:
123 if any invocation of the command exited with status 1-125
pero según la documentación de grep, 1 es el estado de salida si grep no coincide con el patrón
EXIT STATUS
Normally, the exit status is 0 if selected lines are found and 1 otherwise.
Entonces, a mí me parece que la línea de comando que usa emacs para emitir una búsqueda 'rgrep' siempre devolverá 123, y este error debe suprimirse o reemplazarse con una línea de comando como
find . -type f \( -name \*.\[ch\] \) -exec grep -i -nH -e v4l
Respuesta2
Parece que estás intentando realizar un grep recursivo a través de un montón de archivos C .c y .h, mientras ignoras los directorios utilizados por los sistemas de control de versiones. Quieres respuesta. Verhttp://betterthangrep.com/
El comando para hacer exactamente lo que estás haciendo, en ack:
ack --cc -i v4l_compat_ioctl32
Los efectos de -r, -n y -H se suponen en ack. -i todavía no distingue entre mayúsculas y minúsculas y --cc dice "Buscar archivos *.c y *.h únicamente"
No es necesario buscarlo. No hay necesidad de xargs. Sólo una versión de Perl instalada y un único programa Perl, sin módulos externos.