4

Я тестировал CygWin, выполняя «ls -R» с большим каталогом и отправляя вывод в файл Test.txt, поэтому процесс занимает около 30 секунд; файл создан, но он пуст ; она будет заполнена только тогда , когда «LS -R» команда завершается, и мне нужно , чтобы увидеть содержимое файла тем временем новые данные ввода.

Предполагается, что проблема связана с буферизацией, которую операционная система делает перед записью в файл.

Вот что я протестировал, чтобы записать в файл без буферизации:

  • Команда unbuffer из expect пакета: где она? Современная expect версия не имеет такой команды unbuffer (см. Ниже):
    ./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
  • Устанавливая пакет Expect и называя "unbuffer" этот скрипт:
    #!/usr/bin/expect --
    # Description: unbuffer stdout of a program
    # Author: Don Libes, NIST
    eval spawn -noecho $argv
    set timeout -1
    expect
  • Устанавливая пакет Expect и называя "unbuffer" этот другой скрипт:
    #!/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
  • Команда egrep с опцией отмены буферизации:
    cat BigFile.txt | egrep "" --line-buffered | tee Test.txt
  • Stdbuf: он не существует на современном CygWin, или я так думаю.

  • Другие методы:

    ls /cygdrive/y/Repositorio/ -R 1>&2 | tee Test.txt
    ls /cygdrive/y/Repositorio/ -R 1>&2 |& tee Test.txt

Результаты всегда одинаковы: выходной файл Test.txt заполняется только в конце команды «ls -R».

Есть еще идеи, пожалуйста?

0