在ksh
,bash
而且zsh
,time
不是一个命令(内建或没有),它在像语言的保留字for
或while
。
它用于给管道计时1。
在:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
您具有告诉外壳程序运行该管道的特殊语法:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
并为其报告时序统计信息。
在:
time cmd > output 2> error
这是相同的,你定时的cmd > output 2> error
命令,计时统计仍然走在外壳的标准错误。
你需要:
{ time cmd > output 2> error; } 2> timing-output
要么:
exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-
为了timing-output
在使用时间构造(再次不是command)(此处为time cmd > output 2> error 3>&-
)之前将外壳的stderr重定向到。
您还可以time
在重定向了stderr 的子shell中运行该构造:
(time cmd > output 2> error) 2> timing-output
但是这里不需要该子shell,您只需要在time
调用构造时重定向stderr 。
大多数系统还具有time
命令。您可以通过禁用time
关键字来调用该代码。您需要做的就是以某种方式引用该关键字,因为只有在字面意义上才识别出关键字。
'time' cmd > output 2> error-and-timing-output
但要注意的格式可能不同,两者的标准错误time
和cmd
将合并到error-and-timing-output
。
而且,与构造time
相反,该命令time
无法对管道,复合命令或函数或Shell内置命令进行计时...
如果它是内置命令,则它可能能够对函数调用或内置命令进行计时,但无法对重定向或管道或复合命令进行计时。
1请注意,它bash
具有(可以被视为)一个错误,通过该错误time (cmd) 2> file
(time cmd | (cmd2) 2> file
例如,并非如此)将计时输出重定向到file
time
shell关键字还是/usr/bin/time
。这里可能涉及几组描述符(shell的描述符,以及那些附加到time
进程的描述符)。而且,我们不要忘记()
subshell 所隐含的内容。(正在等待bash专家:p)