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

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

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

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

68674 次浏览

you can redirect the time output using,

(time ls) &> file

Because you need to take (time ls) as a single command so you can use braces.

time is shell builtin and I'm not sure if there is way to redirect it. However you can use /usr/bin/time instead, which definitely accept any output redirections.

The command time sends it's output to STDERR (instead of STDOUT). That's because the command executed with time normally (in this case ls) outputs to STDOUT.

If you want to capture the output of time, then type:

(time ls) 2> filename

That captures only the output of time, but the output of ls goes normal to the console. If you want to capture both in one file, type:

(time ls) &> filename

2> redirects STDERR, &> redirects both.

no need to launch sub shell. Use a code block will do as well.

{ time ls; } 2> out.txt

or

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

If you don't want to mix output from time and the command. With GNU time, you can use -o file like:

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

while tim is output of time, out and err are stdout and stderr from grep.

The reason why redirection does not seem to work with time is that it's a bash reserved word (not a builtin!) when used in front of a pipeline. 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.

So, to redirect output of time, either use curly braces:

{ time ls; } 2> filename

Or call /usr/bin/time:

/usr/bin/time ls 2> filename

I use the redirection of stdout and stderr method with braces for testing.
The &>>rpt represents this >>rpt 2>&1 but shorter.
The braces will execute a command(s) in the current shell.   See: man bash

{ time ls a*; } &>>rpt

Not the canonical use case, but another way to go.

Longer running simple tasks can be launched in a detached "screen" terminal with logged output. You could even give the log a unique name.

Primarily this method is good for something that will take hours and is invoked over SSH with a need to "check up on" from time to time. In preference to backgrounding and disowning.

screen -dmL time -v ./crackpassword

You get the same output a terminal would get, with the caveat that this is asynchronous. Of course it could be a script. The output may need tweaking.