我有一个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时,我可以看到它们打印得很慢。
有没有人知道它为什么不按照应有的方式工作?
答案 0 :(得分:2)
您还记得先将$|
设为1吗?听起来不像。
答案 1 :(得分:1)
您的输出可能是行缓冲的。尝试将$| = 1;
添加到脚本的顶部。如果可行的话,有办法进行更多的细化控制。
答案 2 :(得分:0)
您使用的是哪个终端?如果它不是cygwin提供的pty(例如与cygwin一起提供的rxvt),而是Windows控制台,则perl可能无法检测到它正在写入终端,因此默认情况下会在内部缓冲输出,直到它可以写入一个很好的大块。
使用$| = 1;
明确禁止此缓冲。