Shell unbuffering para CygWin: é possível?

4

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:

  • O comando unbuffer do pacote 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
  • Instalar o pacote Esperar e nomear "unbuffer" este script:
    #!/usr/bin/expect --
    # Description: unbuffer stdout of a program
    # Author: Don Libes, NIST
    eval spawn -noecho $argv
    set timeout -1
    expect
  • Instalando o pacote Esperar e nomeando "unbuffer" este outro script:
    #!/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
    }
  • O comando script :
    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
  • O comando egrep com a opção unbuffering:
    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

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?

    
por Sopalajo de Arrierez 16.11.2014 / 17:51

0 respostas