localizar (1) almacena en buffer su salida

localizar (1) almacena en buffer su salida

Estoy usando locate(1)GNU findutils para una pequeña tarea y parece que amortigua su salida. Estoy canalizando la salida de localizar a otra tarea que procesará las líneas a medida que las encuentre. Dado que localizar puede tardar mucho en ejecutarse, pensé que localizar imprimiría los archivos tal como fueron encontrados, pero parece que localizar está almacenando en el búfer la salida.

Si ejecuto localizar en un TTY, imprime la primera coincidencia inmediatamente y usa quizás 10 segundos para encontrar el resto de las coincidencias.

Si, en cambio, ejecuto localizar pero canalizar a gato, no veo nada hasta que se completa el comando completo.

Parece que la ubicación almacena en búfer la salida y no tiene forma de desactivarla.

Lo que quiero lograr es ubicar algunos archivos y ejecutar un comando inmediatamente después de encontrarlo canalizando la salida.

locate something | xargs -n 1 do_something

Pero lo que sucede es que xargs y, por lo tanto, do_something no se invocan hasta que se completa la búsqueda.

Respuesta1

Por supuesto, encontré la respuesta inmediatamente después de publicarla, en unpublicación sugerida por stackexchange al publicar.

unbuffer(de expect) resuelve esto.

unbuffer locate something | xargs -n 1 do_something

ejecuta los comandos tan rápido como localizar puede encontrarlos.

Respuesta2

locatealmacena en búfer la secuencia STDOUT, debe hacer que STDOUT locateno esté en búfer (o en búfer de línea).

Si estás en un sistema GNU, puedes usar stdbuf(viene con GNU coreutils).

Para hacer el STDOUT de locatesin búfer:

stdbuf -o0 locate something | ...

Línea almacenada en búfer:

stdbuf -oL locate something | ...

Compruébalo man stdbufpara tener más ideas.

información relacionada