我正在尝试使用以下命令从time
获取输出。我唯一想要的是获得经过的时间,但我一无所获。
$result = `/usr/bin/time -f %e "./"$PROG > /dev/null`;
print $result;
答案 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`);