Reputation: 3207
Just a little question about timing programs on Linux: the time command allows to measure the execution time of a program:
[ed@lbox200 ~]$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.004s
Which works fine. But if I try to redirect the output to a file, it fails.
[ed@lbox200 ~]$ time sleep 1 > time.txt
real 0m1.004s
user 0m0.001s
sys 0m0.004s
[ed@lbox200 ~]$ cat time.txt
[ed@lbox200 ~]$
I know there are other implementations of time with the option -o to write a file but my question is about the command without those options.
Any suggestions ?
Upvotes: 292
Views: 164164
Reputation: 8935
If you want just the time in a shell variable then this works:
var=`{ time <command> ; } 2>&1 1>/dev/null`
Upvotes: 0
Reputation: 31
If you are using csh
you can use:
/usr/bin/time --output=outfile -p $SHELL -c 'your command'
For example:
/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
Upvotes: 1
Reputation: 3144
I ended up using:
/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
Upvotes: 6
Reputation: 331
If you don't want to touch the original process' stdout and stderr, you can redirect stderr to file descriptor 3 and back:
$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out
real 0m0.009s
user 0m0.004s
sys 0m0.000s
You could use that for a wrapper (e.g. for cronjobs) to monitor runtimes:
#!/bin/bash
echo "[$(date)]" "$@" >> /my/runtime.log
{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log
Upvotes: 3
Reputation: 111
Since the output of 'time' command is error output, redirect it as standard output would be more intuitive to do further processing.
{ time sleep 1; } 2>&1 | cat > time.txt
Upvotes: 10
Reputation: 17110
Try
{ time sleep 1 ; } 2> time.txt
which combines the STDERR of "time" and your command into time.txt
Or use
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
which puts STDERR from "sleep" into the file "sleep.stderr" and only STDERR from "time" goes into "time.txt"
Upvotes: 383
Reputation: 31
#!/bin/bash
set -e
_onexit() {
[[ $TMPD ]] && rm -rf "$TMPD"
}
TMPD="$(mktemp -d)"
trap _onexit EXIT
_time_2() {
"$@" 2>&3
}
_time_1() {
time _time_2 "$@"
}
_time() {
declare time_label="$1"
shift
exec 3>&2
_time_1 "$@" 2>"$TMPD/timing.$time_label"
echo "time[$time_label]"
cat "$TMPD/timing.$time_label"
}
_time a _do_something
_time b _do_another_thing
_time c _finish_up
This has the benefit of not spawning sub shells, and the final pipeline has it's stderr restored to the real stderr.
Upvotes: 3
Reputation: 40645
Simple. The GNU time
utility has an option for that.
But you have to ensure that you are not using your shell's builtin time
command, at least the bash
builtin does not provide that option! That's why you need to give the full path of the time
utility:
/usr/bin/time -o time.txt sleep 1
Upvotes: 74
Reputation: 19977
If you care about the command's error output you can separate them like this while still using the built-in time command.
{ time your_command 2> command.err ; } 2> time.log
or
{ time your_command 2>1 ; } 2> time.log
As you see the command's errors go to a file (since stderr
is used for time
).
Unfortunately you can't send it to another handle (like 3>&2
) since that will not exist anymore outside the {...}
That said, if you can use GNU time, just do what @Tim Ludwinski said.
\time -o time.log command
Upvotes: 22
Reputation: 2863
If you are using GNU time instead of the bash built-in, try
time -o outfile command
(Note: GNU time formats a little differently than the bash built-in).
Upvotes: 7
Reputation: 47317
Wrap time
and the command you are timing in a set of brackets.
For example, the following times ls
and writes the result of ls
and the results of the timing into outfile
:
$ (time ls) > outfile 2>&1
Or, if you'd like to separate the output of the command from the captured output from time
:
$ (time ls) > ls_results 2> time_results
Upvotes: 59
Reputation: 15803
&>out time command >/dev/null
in your case
&>out time sleep 1 >/dev/null
then
cat out
Upvotes: 6