2011-08-16 12 views
0

私は、リモートサーバからいくつかのファイルを取得するperlスクリプトを持っています。私は進捗状況を表現したいと思います。私はそれをやろうとしている方法は、このようなものです:cygwinが私のキャリッジリターンを飲み込んでいるようです

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のは、キャリッジリターンを飲み込むように見えると最後のprint文まで、何も印刷されません。 \ rから\ nに変更すると、スクリプトがゆっくりと印刷されるのを見ることができるので、スクリプトが高速で実行されているため、それは疑わしいです。

誰かがなぜそれが動作するように動作していないか考えている人はいますか?

答えて

2

$|を最初に1に設定することを忘れましたか?そうではありません。

+0

あなたは正しいです、わかりませんでした。 – Malfist

1

あなたの出力はおそらくラインバッファーです。スクリプトの先頭に$| = 1;を追加してみてください。それがうまくいくならば、もっと細かいコントロールをする方法があります。

0

どの端末を使用していますか? cygwinで提供されているpty(cygwinに同梱されているrxvtなど)ではなく、Windowsコンソールであれば、端末に書き込んだことをperlが検出できないことがあるため、デフォルトでは出力を内部でバッファリングして書き込み良いサイズのチャンクを出す。

$| = 1;を使用すると、このバッファリングが明示的に抑制されます。

関連する問題