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

标签 linux perl command

给定以下 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 之前没有“行”可读取。您可以使用readgetc而不是隐含的readline你得到<CMD>一次读取一个字符。还有Term::ReadKey CPAN 中的模块,允许非阻塞单字符读取。

关于linux - 如何自动刷新linux "echo -n",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021367/

相关文章:

php - 在 Debian 上将 PHP 从 5.2.0 更新到 5.2.14 的简单方法是什么?

linux - 交叉编译 libSDL

perl - 如何避免在连接 (.) 中使用未初始化的值?在 perl v5.8.4

node.js - 如何从 Node.js 中执行外部程序?

matlab - 从 .fig 文件增加散点标记大小

linux - 驱动镜像仅分区空间

perl - 如何在perl中通过引用传递哈希

perl - 在 perl 中对两个元素使用 "map()"有什么意义?

linux - bash:如何执行函数而不是同名命令

linux - 哪个 API 在 Linux 中提供无线网络通知?