gnu coreutils dividir verboso liberado?

0

Ao usar o comando GNU coreutils split com o modo verbose, como posso fazer com que as linhas que aparecem no STDOUT sejam liberadas em relação ao momento em que o arquivo foi finalmente criado?

Exemplo anterior, executando assim:

~/coreutils/bin/split --verbose -d -u -l 10000000 1>out & tail -f out
creating file 'x00'
creating file 'x01'
creating file 'x02'
[...]

Eu teria esperado que a linha creating file 'x00' aparecesse no arquivo out depois que o arquivo fosse completamente escrito, mas, em vez disso, parece que nada foi gravado em out até que todo o arquivo tenha sido finalmente processado. Existe uma maneira de mudar esse comportamento?

    
por 719016 02.07.2012 / 16:42

1 resposta

1

Ok, versões antigas do GNU coreutils (antes do 7.5) não têm uma solução fácil (até onde eu sei), mas versões mais recentes (desde 7.5) possuem um comando stdbuf que você pode usar para forçar a divisão (ou qualquer outro programa coreutil) a imprimir imediatamente sua saída. No seu caso, você pode usar:

~/coreutils/bin/stdbuf -o0 ~/coreutils/bin/split --verbose -d -u -l 10000000 1>out & tail -f out

Isso será executado com o buffer de saída desabilitado.

Por favor, note que a opção -u (unbuffered) em split não afeta a impressão da mensagem, apenas os dados que ela está dividindo (parece mais lento se você desabilitar esse buffer).

Informações sobre stdbuf: link

Para uma alternativa ao usar versões mais antigas do coreutils, verifique esta solução usando o comando unbuffer do pacote expect (tcl): link

    
por 02.07.2012 / 17:17