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

jau*_*evn 3 perl time

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

$result = `/usr/bin/time -f %e "./"$PROG > /dev/null`;
print $result;
Run Code Online (Sandbox Code Playgroud)

Gre*_*con 7

所需的重定向只是有点棘手.

my $result = `/usr/bin/time -f %e "./"$PROG 2>&1 >/dev/null`;
Run Code Online (Sandbox Code Playgroud)

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

这个问题的答案我如何捕捉STDERR外部指令的?在Perl FAQ中解决了您所看到的问题.

捕获命令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
Run Code Online (Sandbox Code Playgroud)

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

system("prog args 1>tmpfile 2>&1");
system("prog args 2>&1 1>tmpfile");
Run Code Online (Sandbox Code Playgroud)

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

请注意,$result将包含一个换行符,您可以删除chomp

chomp $result;
Run Code Online (Sandbox Code Playgroud)

或全部在一行中

chomp(my $result = `/usr/bin/time -f %e "./"$PROG 2>&1 >/dev/null`);
Run Code Online (Sandbox Code Playgroud)