cygwin似乎在吞咽我的回车

时间:2011-08-16 19:41:36

标签: perl cygwin carriage-return line-endings

我有一个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 个答案:

答案 0 :(得分:2)

您还记得先将$|设为1吗?听起来不像。

答案 1 :(得分:1)

您的输出可能是行缓冲的。尝试将$| = 1;添加到脚本的顶部。如果可行的话,有办法进行更多的细化控制。

答案 2 :(得分:0)

您使用的是哪个终端?如果它不是cygwin提供的pty(例如与cygwin一起提供的rxvt),而是Windows控制台,则perl可能无法检测到它正在写入终端,因此默认情况下会在内部缓冲输出,直到它可以写入一个很好的大块。

使用$| = 1;明确禁止此缓冲。