如何自动刷新linux"echo -n"

Par*_*roX 2 linux perl command

给出以下bash脚本:

testing.sh:

for i in {1..50}; 
do 
    sleep 0.1;
    echo -n $i;
done
Run Code Online (Sandbox Code Playgroud)

如何使用每个回波实时进行PERL输出?它的工作正常,echoecho -n似乎让PERL认为它是一个很大的回声,而不是单独的回声.

PERL代码适用于普通回声

$| = 1;

open CMD, "testing.sh 2>&1 |";
         while (<CMD>) {
                print "$_ \r";
        }
close CMD;
Run Code Online (Sandbox Code Playgroud)

如果你运行它,你会发现PERL不会打印任何东西5秒(50*0.1s).如果您只是更改为echo -n,echo那么它将实时输出.

这里的想法是我echo -ne "...\r"在bash中使用命令,我希望使用PERL实现相同的效果.


编辑:

我的1..50例子只是为了证明.实际上我想在PERL中打印一个bash进度条,它将更新如下:

[####..............................................] 6.20%
[####..............................................] 6.40%
[#####.............................................] 7.40%
Run Code Online (Sandbox Code Playgroud)

除了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; 
Run Code Online (Sandbox Code Playgroud)

Woo*_*ble 6

while(<CMD>)一次读一行. echo -n不发送换行符,所以在达到EOF之前没有"行"可读.您可以使用readgetc代替readline您所获得的隐含<CMD>一次读取一个角色.Term::ReadKeyCPAN中还有一个模块,允许非阻塞单字符读取.