如何使用反引号来捕获从时间(1)输出的经过时间?

时间:2013-02-21 15:52:29

标签: perl time

我正在尝试使用以下命令从time获取输出。我唯一想要的是获得经过的时间,但我一无所获。

$result = `/usr/bin/time -f %e "./"$PROG > /dev/null`;
print $result;

1 个答案:

答案 0 :(得分:7)

所需的重定向有点棘手。

my $result = `/usr/bin/time -f %e "./"$PROG 2>&1 >/dev/null`;

time输出其对标准错误(文件描述符2)的测量值,但Perl反引号捕获标准输出(文件描述符1)。读取上面的重定向序列为“首先将标准错误发送到标准输出的目标,然后丢弃原始标准输出。”

Perl常见问题解答中How can I capture STDERR from an external command?的答案解决了您所看到的问题。

  

捕获命令STDERR但丢弃其STDOUT

$output = `cmd 2>&1 1>/dev/null`;           # either with backticks
$pid = open(PH, "cmd 2>&1 1>/dev/null |");  # or with an open pipe
while (<PH>) { }                            #    plus a read
     

......在所有这些例子中,订购很重要。那是因为shell严格按照从左到右的顺序处理文件描述符重定向。

system("prog args 1>tmpfile 2>&1");
system("prog args 2>&1 1>tmpfile");
     

第一个命令将标准输出和标准错误发送到临时文件。第二个命令只发送那里的旧标准输出,旧的标准错误显示在旧标准输出上。

请注意,$result将包含一个尾随换行符,您可以使用chomp删除该换行符,如

chomp $result;

或与

一起排在一行
chomp(my $result = `/usr/bin/time -f %e "./"$PROG 2>&1 >/dev/null`);