Estou usando locate(1)
o GNU findutils para uma pequena tarefa e parece que ele armazena sua saída. Estou canalizando a saída de localizar para outra tarefa que processará as linhas conforme localizar as encontra. Como o local pode levar muito tempo para ser executado, pensei que o local imprimiria os arquivos assim que fossem encontrados, mas parece que o local está armazenando em buffer a saída.
Se eu executar localizar em um TTY, ele imprimirá a primeira correspondência imediatamente e usará talvez 10 segundos para encontrar o restante das correspondências.
Se, em vez disso, eu executar localizar, mas canalizar para cat, não verei nada até que todo o comando seja concluído.
Parece que localizar armazena em buffer a saída e não tem como desligá-la.
O que eu quero alcançar é localizar alguns arquivos e executar um comando imediatamente após encontrá-lo, canalizando a saída.
locate something | xargs -n 1 do_something
Mas o que acontece é que xargs e, portanto, do_something não são invocados até que find seja concluído.
Responder1
É claro que encontrei a resposta imediatamente após postar, em umpostagem sugerida por stackexchange ao postar.
unbuffer
(de expect) resolve isso.
unbuffer locate something | xargs -n 1 do_something
executa os comandos o mais rápido que o local pode encontrá-los.
Responder2
locate
armazena em buffer o fluxo STDOUT, você precisa tornar o STDOUT locate
sem buffer (ou buffer de linha).
Se você estiver em um sistema GNU, poderá usar stdbuf
(vem com GNU coreutils
).
Para tornar o STDOUT sem locate
buffer:
stdbuf -o0 locate something | ...
Linha armazenada em buffer:
stdbuf -oL locate something | ...
Verifique man stdbuf
para ter mais ideia.