Cygwin, кажется, глотает мою карету возвращается - PullRequest
0 голосов
/ 16 августа 2011

У меня есть Perl-скрипт, который получает некоторые файлы с удаленного сервера, и я хотел бы иметь возможность представлять прогресс. Я пытаюсь это сделать так:

    print "\tDownloading comp.reg.binary.sdiff.log...\n";
    if(does_file_exist('comp.reg.binary.sdiff.log', @ret)){
        $sftp->get("t-gds/log/comp.reg.binary.sdiff.log", $saveDir, sub {
            my($sftp, $data, $offset, $size) = @_;
            print "\tRead $offset of $size bytes\r";
        });
        print "\n\tDownloaded.\n";
    }else{
        print "\tFile not found on server...skipping.\n";
    }

Однако Cygwin, похоже, глотает возврат каретки и ничего не печатает до последнего оператора печати. Я сомневаюсь в этом, потому что скрипт работает слишком быстро, потому что когда я изменяю \ r на \ n, я вижу, как они распечатываются медленно.

Кто-нибудь знает, почему он не работает так, как должен?

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

Помните ли вы сначала установить $| на 1? Похоже, нет.

1 голос
/ 16 августа 2011

Ваш вывод, вероятно, буферизован. Попробуйте добавить $| = 1; в начало вашего скрипта. Если это сработает, есть способы осуществлять более детальный контроль.

0 голосов
/ 16 августа 2011

Какой терминал вы используете?Если это не pty, предоставленный Cygwin (например, rxvt, который поставляется вместе с cygwin), а консоль Windows, возможно, что Perl не сможет обнаружить, что он пишет в терминал, и, следовательно, по умолчанию будет буферизовать вывод внутри, пока не сможет записатьблок хорошего размера.

Используйте $| = 1; для явного подавления этой буферизации.

...