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

问题描述 投票:0回答:9

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

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

在文件中,我可以看到

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

shell unix time io-redirection
9个回答
152
投票

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

{ time ls; } 2> out.txt

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

114
投票

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

(time ls) &> file

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


37
投票

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

如果你想捕获时间的输出,则输入:

(time ls) 2> filename

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

(time ls) &> filename

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


11
投票

时间是 shell 内置的,我不确定是否有办法重定向它。不过你可以使用

/usr/bin/time
相反,它肯定接受任何输出重定向。


10
投票

重定向似乎不适用于

time
的原因是,当在管道前面使用时,它是 bash 保留字(不是内置字!)。重击(1):

如果时间保留字位于管道之前,则经过的时间以及 当执行时消耗的用户和系统时间被报告 管道终止。

因此,要重定向

time
的输出,可以使用大括号:

{ time ls; } 2> filename

或致电

/usr/bin/time

/usr/bin/time ls 2> filename

8
投票

如果您不想混合

time
和命令的输出。 使用 GNU 时间,您可以使用
-o file
,例如:

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

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


2
投票

我使用带大括号的 stdout 和 stderr 方法的重定向来进行测试。

&>>rpt
代表这个
>>rpt 2>&1
,但更短。
大括号将在当前 shell 中执行命令。   请参阅:男人狂欢

{ time ls a*; } &>>rpt

1
投票

不是规范的用例,而是另一种方法。

可以在独立的“屏幕”终端中启动运行时间较长的简单任务,并记录输出。您甚至可以为日志指定一个唯一的名称。

这种方法主要适用于需要花费数小时并且通过 SSH 调用且需要不时“检查”的事情。优先于背景和否认。

screen -dmL time -v ./crackpassword 

您将获得与终端相同的输出,但需要注意的是这是异步的。当然,它也可以是一个脚本。输出可能需要调整。


0
投票

默认情况下,

time
输出进入STDERR。您可以将
time
输出写入文件,如下所示

time -o time.log ls > filename

-o
time
输出写入 FILE 而不是 STDERR

如果您希望

time
输出与命令的 stderr 混合在一起,那么您可以使用

time -a -o ls.err ls > ls.out 2> ls.err

-a
(与
-o
)追加而不是覆盖 FILE。

请参阅文档了解更多选项和详细信息。

注意:在某些系统上

time
是返回当前时间的内置/保留关键字。要绕过此操作,请使用以下之一

$ /usr/bin/time --help
$ env time --help
$ \time --help
© www.soinside.com 2019 - 2024. All rights reserved.