2013-05-29

No entiendo porqué uno anda y el otro no

Quiero ejecutar cscope buscando recursivamente en un directorio los archivos que van a ser indexados, para eso hago:

$ find . -type f -and \( -name "*.c" -or -name "*.h" \) | xargs cscope

y abre el cscope una décima de segundo y se cierra

pero si hago

$ cscope `find . -type f -and \( -name "*.c" -or -name "*.h" \)`

anda bien.

¿Se les ocurre que puede ser?

1 comentario:

aurelianito dijo...

Spoiler alert!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Martín Di Paola, amigo y compañero de laburo, desculó porqué no anda con xargs.

Cuando uno invoca xargs tomando los parámetros para el proceso hijo por stdin, xargs no recibe una referencia a la terminal en la que está corriendo, ya que recibe en stdin el pipe donde vienen los parámetros. Por lo tanto, el proceso hijo, que en este caso es cscope, no tiene de dónde sacar la terminal. Según la documentación de xargs, en este caso al proceso hijo le pasa como stdin /dev/null.

Por lo tanto, cscope toma /dev/null como stdin y recibe un EOF cuando intenta leer (^D) y se cierra. Obtiene el mismo efecto si prueban hacer cosas con netcat.