如何重定向“time”命令的输出?

时间:2010-03-09 12:32:28

标签: shell unix time io-redirection

我尝试重定向time命令的输出,但我不能:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

在文件中,我可以看到ls命令的输出,而不是time的输出。 请解释,为什么我不能以及如何做到这一点。

7 个答案:

答案 0 :(得分:114)

无需启动子shell。使用代码块也可以。

{ time ls; } 2> out.txt

{ time ls > /dev/null 2>&1 ; } 2> out.txt

答案 1 :(得分:94)

您可以使用

重定向时间输出
(time ls) &> file

因为你需要把(时间ls)作为一个命令,所以你可以使用大括号。

答案 2 :(得分:21)

命令时间将其输出发送到STDERR(而不是STDOUT)。这是因为正常执行的命令(在本例中为ls)输出到STDOUT。

如果要捕获时间输出,请键入:

(time ls) 2> filename

仅捕获时间输出,但ls的输出正常到控制台。如果要在一个文件中捕获两者,请键入:

(time ls) &> filename

2 - ;重定向STDERR,&>重定向两者。

答案 3 :(得分:9)

时间是内置的,我不确定是否有办法重定向它。但是你可以使用 /usr/bin/time代替,它肯定接受任何输出重定向。

答案 4 :(得分:3)

如果您不想混合time的输出和命令。 使用GNU时间,您可以使用-o file,如:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

tim是时间输出时,outerr是来自grep的stdout和stderr。

答案 5 :(得分:2)

重定向似乎不适用于time的原因是它在管道前使用时是一个bash保留字(不是内置的!)。的bash(1):

  

如果时间保留字在管道之前,则已经过去了   当执行时,会报告其执行所消耗的用户和系统时间   管道终止。

因此,要重定向time的输出,请使用花括号:

{ time ls; } 2> filename

或致电/usr/bin/time

/usr/bin/time ls 2> filename

答案 6 :(得分:0)

我使用带有括号的stdout和stderr方法的重定向进行测试。
&>>rpt代表此>>rpt 2>&1,但更短。
花括号将在当前shell中执行命令。请参阅:man bash

{ time ls a*; } &>>rpt