2011-05-18 25 views
4

我想的進度指示符需要從補充的一個Perl極品一個Perl系統進度指示器()命令,使用T:R:G MOD

system('make') 

輸出和每行輸出到STDOUT命令,我想輸出一個點作爲進度指示器。不幸的是,我使用Term :: ReadLine :: Gnu Perl mod。

在make命令運行時,如何重定向STDOUT以捕獲和計數行數?

+0

您也可以找到[期限:: ProgressBar](http://search.cpan.org/perldoc/Term::ProgressBar)的使用。 – Ether 2011-05-19 00:37:36

回答

7
#!/usr/bin/perl 

my $command = "make"; 

open (my $cmd, "$command |"); 
while(<$cmd>){ 
    print "."; 
} 
print "\n"; 
+3

我建議使用三個參數'open'來表示:'打開我的$ cmd,' - |',$ command或者$'';'這樣更安全,更高效。 – friedo 2011-05-19 01:03:01

+0

不錯的建議,我使用專門用於文件的三個arg版本,爲什麼不使用管道呢?另外,這可能是使用印模在模具上可能有其優點的情況。 – wespiserA 2011-05-19 01:11:26

+3

您需要自動隱藏STDOUT,否則在打印之前會等待整行點。 '使用IO :: Handle; STDOUT-> autoflush(1)' – Schwern 2011-05-19 06:20:57

4
make >& >(while read f; do echo -n .; done; echo) 

顯然這是一個shell解決方案,但點作爲進度指示器是一個點。

你當然可以在那裏貼一個發球臺,以便在發生問題時保存一份文件的副本。

既然你似乎並不喜歡(既不upvoted或接受)用於一些無法解釋的原因殼溶液,這裏是一個單純的Perl之一:

if (open(X,"make|")) { local($|)=1; while(<X>) { print "."; } close(X); print "\n";} 
+0

我還沒有想過讓貝殼做沉重的舉動......有趣。 – bitbucket 2011-05-19 00:08:22

+0

@bitbucket:在前面的shell答案中添加了一個純粹的perl選項。 – 2011-05-19 00:25:35

+0

我不得不睡一會兒......我今天正在測試解決方案。 – bitbucket 2011-05-19 16:10:03