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?