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

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

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

我想做的是:

  • 使用time命令来测量同时运行多个命令所花费的时间
  • 仅有的输出time到文件
  • 写下stderr我正在测量的所有命令stderr不是到文件

我做什么不是想做的是:

  • 将多个命令写入单独的脚本中
    • 为什么?因为所有这些已经是我以编程方式生成并创建的脚本其他临时脚本会比我想要的更混乱。

到目前为止我已经尝试过:

  1. /usr/bin/time --output=outtime -p echo "a"; echo "b";
    • 不起作用,time仅在第一个上运行。
  2. /usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
    • 不起作用,(是意外的令牌。
  3. /usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
    • 不起作用,“没有这样的文件或目录”。
  4. /usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
    • 不起作用,“没有这样的文件或目录”。
  5. time ( echo "a"; echo "b"; ) 2>outtime
    • 不起作用,因为它将所有内容重定向STDERRouttime;我只想要time那里的输出。
  6. 而且当然,time --output=outime echo "a";
    • 不起作用,因为--output=outime: command not found

我该怎么做?

答案1

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

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

答案2

不是正确答案,但与问题非常相关。
获取多个程序的时序统计信息需要组合括号。用分号分隔命令;或者 &&,如果仅应运行 command2,则当 command1 无错误退出时:

time ( command1 ; command2 )

time ( command1 && command2 )

答案3

尝试这个:

% (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 的注释暗示 . 的情况并非如此。] 我们可以通过在子 shell 中运行然后重定向该子 shell 的输出来实现的输出bash重定向。timetime

% (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

就是这样。

答案4

在 bash 上,这对我来说非常有效,在控制台上没有打印任何内容。

> time ( echo "a"; echo "b") 1>/dev/null 2>output_time_file

> cat output_time_file

real    0m0.000s
user    0m0.000s
sys 0m0.000s

相关内容