100

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

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

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

4

7 回答 7

136

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

{ time ls; } 2> out.txt

或者

{ time ls > /dev/null 2>&1 ; } 2> out.txt
于 2010-03-09T13:14:51.923 回答
110

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

(time ls) &> file

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

于 2010-03-09T12:34:45.963 回答
27

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

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

(time ls) 2> filename

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

(time ls) &> filename

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

于 2010-03-09T13:05:08.787 回答
11

time 是 shell 内置的,我不确定是否有办法重定向它。但是,您可以 /usr/bin/time改用它,它肯定接受任何输出重定向。

于 2010-03-09T12:37:46.890 回答
6

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

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

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

{ time ls; } 2> filename

或致电/usr/bin/time

/usr/bin/time ls 2> filename
于 2018-03-02T09:38:37.923 回答
4

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

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

whiletim是时间的输出,outerr来自grep.

于 2015-01-13T07:51:53.450 回答
0

我使用带有大括号的 stdout 和 stderr 方法的重定向进行测试。代表这个
但更短。 大括号将在当前 shell 中执行命令。参见:人 bash&>>rpt>>rpt 2>&1

{ time ls a*; } &>>rpt
于 2020-07-25T21:36:56.777 回答