locate (1) armazena em buffer sua saída [duplicada]

0

Estou usando locate(1) do GNU findutils para uma pequena tarefa e parece que ela armazena sua saída. Estou canalizando a saída do locate para outra tarefa que processará as linhas conforme o locate as localizar. Como o locate pode levar muito tempo para ser executado, achei que o locate imprimiria os arquivos da forma como foram encontrados, mas parece que o locate está armazenando em buffer a saída.

Se eu executar o locate em um TTY, ele imprime a primeira partida imediatamente e usa talvez 10 segundos para encontrar o restante das partidas.

Se, em vez disso, eu executar locate mas pipe to cat, não vejo nada até que o comando inteiro seja concluído.

Parece que o locate armazena a saída e não tem como desativá-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, consequentemente, do_something não são invocados até que a conclusão seja concluída.

    
por mogsie 29.09.2016 / 11:10

2 respostas

1

locate armazena em buffer o fluxo STDOUT, você precisa fazer o STDOUT de locate unbuffered (ou line buffered).

Se você estiver em um sistema GNU, você pode usar stdbuf (vem com o GNU coreutils ).

Para tornar o STDOUT de locate unbuffered:

stdbuf -o0 locate something | ...

Linha em buffer:

stdbuf -oL locate something | ...

Verifique man stdbuf para ter mais ideia.

    
por 29.09.2016 / 15:50
0

É claro que encontrei a resposta imediatamente após a postagem, em uma postagem sugerida por stackexchange ao postar .

unbuffer (da expectativa) resolve isso.

unbuffer locate something | xargs -n 1 do_something

executa os comandos tão rapidamente quanto o locate pode encontrá-los.

    
por 29.09.2016 / 11:13