Eu testei no CygWin fazendo "ls -R" com um diretório grande e enviando a saída para um arquivo Test.txt
, então o processo leva cerca de 30 segundos completar; o arquivo é criado, mas está vazio ; ele só será preenchido quando o comando "ls -R" terminar , e eu preciso ver o conteúdo do arquivo enquanto novos dados são inseridos.
O problema deve vir do buffering que o sistema operacional faz antes de gravar no arquivo.
Isso é o que testei para gravar no arquivo sem buffer:
expect
: onde está? A versão expect
moderna não possui esse comando unbuffer
(veja abaixo): ./unbuffer -p ls /cygdrive/y/Repositorio/ -R > Test.txt ./unbuffer ls /cygdrive/y/Repositorio/ -R | tee Test.txt ./unbuffer -p ls /cygdrive/y/Repositorio/ -R | tee Test.txt ./unbuffer ls /cygdrive/y/Repositorio/ -R | ./unbuffer -p egrep "" | tee Test.txt ./unbuffer -p ls /cygdrive/y/Repositorio/ -R | ./unbuffer -p egrep "" | tee Test.txt
#!/usr/bin/expect -- # Description: unbuffer stdout of a program # Author: Don Libes, NIST eval spawn -noecho $argv set timeout -1 expect
#!/usr/bin/expect -- # Description: unbuffer stdout of a program # Author: Don Libes, NIST if {[string compare [lindex $argv 0] "-p"] == 0} { # pipeline set stty_init "-echo" eval spawn -noecho [lrange $argv 1 end] close_on_eof -i $user_spawn_id 0 interact { eof { # flush remaining output from child expect -timeout 1 -re .+ return } } } else { set stty_init "-opost" set timeout -1 eval spawn -noecho $argv expect }
script -c "ls /cygdrive/y/Repositorio/ -R" | tee Test.txt script -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | tee Test.txt script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | tee Test.txt script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | grep "" --line-buffered | tee Test.txt script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | egrep "" --line-buffered | tee Test.txt
cat BigFile.txt | egrep "" --line-buffered | tee Test.txt
O stdbuf : ele não existe no CygWin moderno, ou assim eu acho.
Outros métodos:
ls /cygdrive/y/Repositorio/ -R 1>&2 | tee Test.txt ls /cygdrive/y/Repositorio/ -R 1>&2 |& tee Test.txt
Testes feitos com bash
e mintty
.
Verificado e testado tudo em estes tópicos :
Escrevendo a saída "tail -f" para outro arquivo < br> link
link
Os resultados são sempre os mesmos: o arquivo de saída Test.txt
é preenchido apenas no final do comando "ls -R".
Mais alguma ideia, por favor?