如何自动刷新linux“echo -n”

时间:2011-02-16 19:49:11

标签: linux perl command

给出以下bash脚本:

testing.sh:

for i in {1..50}; 
do 
    sleep 0.1;
    echo -n $i;
done

如何使用每个回声实时进行PERL输出?如果它echoecho -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; 

1 个答案:

答案 0 :(得分:6)

while(<CMD>)一次读取一行。 echo -n不会发送换行符,因此在达到EOF之前无法读取“行”。您可以使用readgetc代替readline所带来的隐含<CMD>来一次读取一个字符。 CPAN中还有Term::ReadKey模块,允许非阻塞单字符读取。