关于shell:如何重定向“time”命令的输出?

How can I redirect the output of the “time” command?

我试图重定向时间命令的输出,但无法:

1
2
3
4
$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

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


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

1
{ time ls; } 2> out.txt

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


您可以使用重定向时间输出,

1
(time ls) &> file

因为您需要将(time ls)作为单个命令,以便可以使用大括号。


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

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

1
(time ls) 2> filename

它只捕获时间的输出,但是ls的输出在控制台上是正常的。如果要在一个文件中同时捕获这两个文件,请键入:

1
(time ls) &> filename

2>重定向stderr,&;>同时重定向两者。


时间是shell内置的,我不确定是否有方法重定向它。但是你可以用相反,它肯定接受任何输出重定向。


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

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

tim是时间的输出时,outerrgrep的stdout和stderr。


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

If the time reserved word precedes a pipeline, the elapsed as well as
user and system time consumed by its execution are reported when the
pipeline terminates.

因此,要重定向time的输出,可以使用大括号:

1
{ time ls; } 2> filename

或致电/usr/bin/time

1
/usr/bin/time ls 2> filename