2013-12-11 52 views
0

我正在尝试编写执行RKHunter扫描的Perl CGI。在执行comman时,我想显示一些内容来指示进度,而不是将要重定向到另一个文件的实际输出。到目前为止的代码是:Perl - 在执行系统()命令期间显示进度

open(my $quik_rk, '-|', 'rkhunter', '--enable', '"known_rkts"') or print "ERROR RUNNING QUICK ROOTKIT CHECK!!"; 
     while(<$quik_rk>) 
     {  print "."; 
     }  
     print "\n"; 
     close($quik_rk); 

这不显示任何输出,我在等待执行完成时显示一个空白屏幕。所有的点都打印到屏幕一起,而不是一个接一个,而且,当我用下面的重定向,该命令不执行都:

open(my $quik_rk, '-|', 'rkhunter', '--enable', '"known_rkts"', '>>', '/path/to/file') or print "ERROR RUNNING QUICK ROOTKIT CHECK!!"; 

我怎样才能解决这个问题这样一个细节输出重定向到一个文件,只有一个....在屏幕上稳步前进?

+1

http://stackoverflow.com/q/1645308/1030675 – choroba

回答

2
$|=1; 

在脚本的开头。 这将打开autoflush,因此每个打印实际上都会打印出来,而不是在刷新缓冲区之前等待换行符。

另见:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles

+0

所以我需要执行,使其恢复正常的行为后关闭自动冲洗? – rahuL

+0

每次打印命令后都会继续刷新。所以除非你真的想要在实际上在同一个脚本中打印之前缓冲没有换行符的几个打印命令,否则你可能不会注意到它正在被打印。但是当然你可以立即用'$ | = 0;'将它关闭。然后它将返回到仅在遇到换行符时打印。 – DeVadder

+0

好的非常感谢:) – rahuL