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
locate
almacena en búfer la secuencia STDOUT, debe hacer que STDOUT locate
no 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 locate
sin búfer:
stdbuf -o0 locate something | ...
Línea almacenada en búfer:
stdbuf -oL locate something | ...
Compruébalo man stdbuf
para tener más ideas.