Reputation: 4797
I tried to redirect the output of the time command, but I couldn't:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
In the file I can see the output of the ls
command, not that of time
.
Please explain, why I couldn't and how to do this.
Upvotes: 121
Views: 73559
Reputation: 3340
The time
output goes to STDERR by default. You can write the time
output to a file like so
time -o time.log ls > filename
-o
writes the time
output to FILE instead of STDERR
If you want the time
output to be mixed in with your command's stderr, then you can use
time -a -o ls.err ls > ls.out 2> ls.err
-a
(with -o
) appends instead of overwriting FILE.
See the docs for more options and details.
Note: on some systems time
is a built-in/reserved keyword that returns the current time. To bypass this use one of
$ /usr/bin/time --help
$ env time --help
$ \time --help
Upvotes: 0
Reputation: 1830
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.
Upvotes: 1
Reputation: 21
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
Upvotes: 2
Reputation: 12745
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
Upvotes: 10
Reputation: 51311
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.
Upvotes: 37
Reputation: 3268
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
.
Upvotes: 9
Reputation: 342649
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
Upvotes: 152
Reputation: 10091
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.
Upvotes: 11
Reputation: 1721
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.
Upvotes: 114