给定以下 bash 脚本:
测试.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 示例只是为了演示。实际上,我希望在 bash 进度条中用 PERL 打印,该进度条将更新为:
[####..............................................] 6.20%
[####..............................................] 6.40%
[#####.............................................] 7.40%
除了 bash 将使用\r 而不是\n 之外。这与 wget 的进度条类似。我希望在 PERL 中也能达到同样的效果。好处是我看到 read 可以通过 X 个字符读取,并且 echo 将是设定的长度。我找不到任何适合我想做的事情的好例子。
编辑2:
我得到了我需要阅读的内容...
现在我正在努力用进度条来完善它。进度条正好是 60 字节,我使用以下内容:
$| = 1;
open CMD, "testing.sh 2>&1 |";
my ($buf, $data, $n);
while (($n = read CMD, $data, 60) != 0) {
print $data;
}
close CMD;
最佳答案
while(<CMD>)
一次读取一行。 echo -n
不发送换行符,因此在到达 EOF 之前没有“行”可读取。您可以使用read
或getc
而不是隐含的readline
你得到<CMD>
一次读取一个字符。还有Term::ReadKey
CPAN 中的模块,允许非阻塞单字符读取。
关于linux - 如何自动刷新linux "echo -n",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021367/