3

我正在尝试time使用以下命令获取输出。我唯一想要的是得到经过的时间,但我什么也没得到。

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

1 回答 1

7

所需的重定向有点棘手。

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

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

如何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

… 在所有这些示例中,排序都很重要。这是因为 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`);
于 2013-02-21T16:24:54.920 回答