Struggling to parse (bash) time command
If you use the Bash builtin time
, you can control its output by setting the TIMEFORMAT
variable:
TIMEFORMAT=%R
and you won't have to do any parsing since that will cause time
to only output the number of seconds.
and use this:
echo "Testing..."TIME=$( { time ls -lh > /dev/null; } 2>&1 )echo $TIME
or one of the other techniques from BashFAQ/032.
First and foremost, the data you're trying to capture is being written to standard error. But capturing that output is fairly tricky in this case.
time
is both an executable (in /usr/bin
) as well as built-in shell command in bash and other shells. When you execute time
without specifying /usr/bin/time
, you are executing a built-in command in bash. This makes it hard to do things with the output, since bash does not treat it like a normal program; it's a special built-in function written by bash.
Knowing that, and looking at the man page for time(1)
, I can see that the data you're trying to capture from time
is outputted to stderr. So my workaround for this is to directly execute /usr/bin/time
as follows:
TIME=`/usr/bin/time ls -lh 2>&1 >/dev/null`
This copies the standard error stream to standard out, and then redirects what normally goes to standard out to /dev/null
. Standard error, however, will still go to standard out since it was duplicated before the redirection. Reversing the order of these will not work. (Yes, this is confusing.)
Unfortunately, /usr/bin/time
is a bit less precise in its output:
0.00 real 0.00 user 0.00 sys
Alternatively, you can use 2 sub-shells, as follows:
TIME=$((time ls -lh >/dev/null) 2>&1)
This would re-write what is written to standard error on the second subshell within the first, allowing you to capture the output. See http://www.tldp.org/LDP/abs/html/subshells.html for more on sub-shells.