我在 *nix 系统上有一个 Perl 脚本,它曾经处理 50,000 多行文本。这需要一些时间。我试图找到一种资源友好的方式,让用户知道程序在处理所有这些文本时没有挂起。
目前,我正在处理文本时实时打印输出。我正在刷新输出缓冲区,然后在一行上打印输出\r
。这似乎是对资源的不必要使用,因为它几乎是我不打印任何内容时的两倍,但正如我所说,当不打印任何内容时,程序看起来像是挂了。
所以我的问题是:在执行长时间运行的任务时,是否有一种标准或简单的方法可以让用户知道程序确实在运行?
[我刚刚意识到你的脚本是perl,但同样的逻辑适用print "\r"
,等等。你会想要使用STDERR
或关闭缓冲,$| = 1
. 见底部。]
实现 CLI“进度指示器”的一种方法涉及使用\r
(回车)字符。这会将光标带到当前行的开头:
#!/bin/bash
count=0
while ((1)); do
echo -ne "\rCount: $count"
sleep 1;
count=$(($count+1));
done
Run Code Online (Sandbox Code Playgroud)
如果它没有意义,那就试试吧。
您可以使用该技术来指示到目前为止已处理了多少行或数千行。数十或数百行可能是好的,因为它不是太频繁(更多更新 == 运行时间更慢),但可能仍然足够频繁以显示进度仍在继续。您可以指定一个单位或仅附加零。
注意-n
和-e
with的使用echo
,这很重要。
您也可以使用\b
(backspace) 达到类似的效果。
在 perl 中:
#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);
$| = 1; # Pipeline stdout (i.e., no buffering).
my $count = 1;
while ($count) {
print "\rCount $count";
sleep 1;
$count++;
}
Run Code Online (Sandbox Code Playgroud)