给出以下bash脚本:
testing.sh:
for i in {1..50};
do
sleep 0.1;
echo -n $i;
done
如何使用每个回声实时进行PERL输出?如果它echo
但echo -n
似乎使PERL认为它是一个很大的回声而不是单独的回声,它可以正常工作。
适用于普通回声的PERL代码
$| = 1;
open CMD, "testing.sh 2>&1 |";
while (<CMD>) {
print "$_ \r";
}
close CMD;
如果你运行它,你会发现PERL不会打印任何东西5秒(50 * 0.1s)。如果您只是将echo -n
更改为echo
,那么它将实时输出。
这里的想法是我在bash中使用命令echo -ne "...\r"
,我希望使用PERL达到相同的效果。
编辑:
我的1..50例子只是为了证明。实际上我想在PERL中打印一个bash进度条,它将更新如下:
[####..............................................] 6.20%
[####..............................................] 6.40%
[#####.............................................] 7.40%
除了bash将使用\ r而不是\ n。这与wget的进度条类似。我希望在PERL中有相同的效果。好处是我看到读取可以通过X字符读取,并且回声将是设定长度。我找不到任何适合我试图做的好的例子。
编辑2:
我得到了我需要阅读的内容......
现在我正在使用进度条完善它。进度条正好是60个字节,我使用以下内容:
$| = 1;
open CMD, "testing.sh 2>&1 |";
my ($buf, $data, $n);
while (($n = read CMD, $data, 60) != 0) {
print $data;
}
close CMD;
答案 0 :(得分:6)
while(<CMD>)
一次读取一行。 echo -n
不会发送换行符,因此在达到EOF之前无法读取“行”。您可以使用read
或getc
代替readline
所带来的隐含<CMD>
来一次读取一个字符。 CPAN中还有Term::ReadKey
模块,允许非阻塞单字符读取。