2010-03-09 96 views
64

我试图重定向时间命令的输出,但我不能。如何重定向“时间”命令的输出?

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

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

+1

应该对超级用户,我想。 – Mnementh 2010-03-09 13:06:05

+1

我不这么认为! – abubacker 2010-03-09 13:11:00

+1

这个问题的答案不仅对程序员感兴趣,而且对其他高级用户也很感兴趣:http://superuser.com/ – Mnementh 2010-03-09 13:14:05

回答

75

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

(time ls) &> file 

因为你需要采取(时间LS)作为单个命令因此可以使用大括号。

+0

耶很好,但问题是他们是如何做到这一点的? – abubacker 2010-03-09 12:41:19

+1

time命令将把参数作为命令。但括号会将它归为一个命令。 例: 时间LS> FILE1.TXT 在自变量, 0 =时间 1 = “LS> FILE1.TXT” – sganesh 2010-03-09 12:49:13

+5

而时间命令打印在stderr输出。所以你可以使用 (时间ls)2>文件 – sganesh 2010-03-09 12:54:29

8

时间是shell内建的,我不确定是否有方法重定向它。但是,您可以使用 /usr/bin/time,它可以接受任何输出重定向。

+0

/usr/bin/time --output filename ls – chub 2010-03-09 12:39:50

+3

内置时间与输出重定向一起工作良好。它只在STDERR上输出,而不在STDOUT上输出。 – Mnementh 2010-03-09 13:09:40

+0

问题是内置命令是在shell环境本身内执行的,而不是一个子外壳。由于您的shell的stderr通常连接到终端,重定向不会执行任何操作。为了重定向内置时间,我相信你必须做一些像'bash time mycmd 2> file'一样的东西。或者像上面提到的那样调用'/ usr/bin/time'。 – ktbiz 2017-08-17 02:36:20

16

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

如果你想捕捉的时间输出,然后键入:

(time ls) 2> filename 

捕捉只是时间的输出,但LS的输出变为正常的控制台。如果你想同时捕获在一个文件中,键入:

(time ls) &> filename 

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

+1

这个答案实际上回答了*为什么* OP的重定向不起作用,这是OP要求的问题之一。没有其他人解决这个问题。 – Joshua 2016-06-01 14:27:40

101

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

{ time ls; } 2> out.txt 

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

+1,最佳答案 – 2010-03-09 13:19:23

+0

同意,最佳答案。给你选择抛弃ls结果并获得时间。谢谢ghostdog74 – rd42 2011-09-10 11:43:23

+0

当AIX没有任何东西可以重定向“hostent”命令的输出时,它就可以工作。谢谢! – Hugo 2015-05-01 04:04:50

3

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

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

tim是时间输出,outerrgrep输出和错误。

0

重定向似乎不适用于time的原因是它在流水线前使用时是bash保留字(不是内建的!)。的bash(1):

如果时间保留字之前的管线,通过其执行中所消耗的经过以及 用户和系统时间被报告的 管道终止时。

所以,重定向的time输出,要么使用大括号:

{ time ls; } 2> filename 

或致电/usr/bin/time

/usr/bin/time ls 2> filename