我正在尝试做一些非常粗略的基准测试,所以我想time从我的脚本中运行命令.我有以下内容:
#!/usr/bin/perl
use strict;
my $command = "/usr/bin/time -f \"%U,%S,%E,%P,%K,%M\" ...";
my $stats = `$command`;
print "stats: $stats\n";
Run Code Online (Sandbox Code Playgroud)
不幸的是,看起来命令的结果从未分配给$stats.当我执行脚本时,我得到如下内容:
0.15,0.03,0:00.44,43%,0,143808
stats:
Run Code Online (Sandbox Code Playgroud)
所以看起来它time成功运行命令,但打印出值STDOUT而不是赋值$stats.当我使用另一个命令时ls,它似乎按预期工作.我在这做错了什么?
time 打印到stderr.
$ /usr/bin/time -f "%U,%S,%E,%P,%K,%M" echo foo >/dev/null
0.00,0.00,0:00.03,10%,0,2352
$ /usr/bin/time -f "%U,%S,%E,%P,%K,%M" echo foo >/dev/null 2>/dev/null
$
Run Code Online (Sandbox Code Playgroud)
所以只需添加2>&1到您的命令.
time 写入标准错误,因此您需要将其重定向到标准输出以使用Perl的反引号捕获它
my $command = "/usr/bin/time -f \"%U,%S,%E,%P,%K,%M\" ... 2>&1";
Run Code Online (Sandbox Code Playgroud)