我尝试重定向time命令的输出,但我不能:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
在文件中,我可以看到ls
命令的输出,而不是time
的输出。
请解释,为什么我不能以及如何做到这一点。
答案 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
是时间输出时,out
和err
是来自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