如何在多个命令上运行时间并将时间输出写入文件?


65

我想运行time命令来测量几个命令的时间。

我想做的是:

  • 测量所有这些加在一起的运行时间
  • time输出写入文件
  • STDERR我要测量的命令写到STDERR

我确实希望做的是

  • 将几个命令写到一个单独的脚本中(为什么?因为所有这些已经是我以编程方式生成的脚本,因此创建另一个临时脚本会比我想要的更混乱)

到目前为止我尝试过的是:

/usr/bin/time --output=outtime -p echo "a"; echo "b";

不起作用,time仅在第一个上运行。

/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )

不起作用,(是意外令牌。

/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }

不起作用,“没有这样的文件或目录”。

/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'

不起作用,“没有这样的文件或目录”。

time ( echo "a"; echo "b"; ) 2>outtime

不起作用,因为它将全部重定向STDERRouttime; 我只想要time那里的输出。

而且当然,

time --output=outime echo "a";

自以来不起作用--output=outime: command not found

我该怎么做?

Answers:


90

使用sh -c 'commands'的命令,例如:

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'

2
较短的版本:time -p sh -c 'echo "a"; echo "b"'
Geo

7

尝试这个:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

说明:

首先,我们必须找到一种方法来重定向的输出time。由于time是内置的shell,因此它将完整的命令行作为要测量的命令,包括重定向。从而,

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[注意:janos的注释暗示情况并非如此bash。]我们可以time通过time在子shell中运行然后重定向该子shell 的输出来实现的输出重定向。

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

现在,我们已成功重定向的输出time,但其输出与我们正在测量的命令的错误输出混合在一起。为了将两者分开,我们使用了一个附加的文件描述符。

在“外面”,我们有

% (time ... ) 3>&2 2>timeout

这意味着:无论写入文件描述符3的内容如何,​​都将输出到同一位置(终端输出)文件描述符2(标准错误)。然后我们将标准错误重定向到文件timeout

现在我们有了:写入stdout和fd 3的所有内容都将进入终端,而写入stderr的所有内容均将进入文件。剩下的就是将测量到的命令的stderr重定向到fd 3。

% (time whatever 2>&3) 3>&2 2>timeout

现在,要使用多个命令来衡量时间,我们需要在(其他!)子shell(括号内)中运行它们。并将所有错误输出重定向到fd 3,我们需要将它们分组在大括号内。

所以,最后,我们到达:

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

而已。


这是POSIX Shell中的语法错误。可能是bashism?
josch

@josch这里使用的外壳是zsh。
安格斯

6

不是正确的答案,但与问题非常相关。
需要获得多个程序的时间统计信息,并加上括号。用分号分隔命令。

time ( command1 ; command2 )

1
很好 更好的是,在命令之间使用&& -就像这样,time ( command1 && command2 )以便第一个命令失败时;它不会继续执行另一个。
bikashg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.