我想运行time
命令来测量多个命令的时间。
我想做的是:
- 使用
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
- 不起作用,因为它将所有内容重定向
STDERR
到outtime
;我只想要time
那里的输出。
- 不起作用,因为它将所有内容重定向
- 而且当然,
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
重定向。time
time
% (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