bashshelltimewget

Capturing the output of bash time in script variable


I'm trying this:

TIMEFORMAT=%R;
foo=$(time wget http://www.mysite.com)
echo $foo

and when I execute I see the number I want in the output but not in variable foo (echo $foo print nothing).

Why is that?


Solution

  • You are not capturing anything in foo because time sends its output on stderr. The trouble is that the wget command also sends most of its output on stderr. To split the two streams (and throw away the output from wget) you will need to use a subshell:

    TIMEFORMAT=%R;
    foo=$( time ( wget http://www.example.com 2>/dev/null 1>&2 ) 2>&1 )
    echo $foo
    

    Here is an explanation of what's going on...

    The inner part of this command:

    ( wget http://www.example.com 2>/dev/null 1>&2 )
    

    Sends both stderr and stdout to /dev/null, essentially throwing them away.

    The outer part:

    foo=$( time ( ... ) 2>&1 )
    

    Sends stderr from the time command to the same place that stdout is sent so that it may be captured by the command substitution ($()).

    Update:

    If you wanted to get really clever, you can have the output of wget passed through to stderr by juggling the file descriptors like this:

    foo=$( time ( wget http://www.example.com 2>&1 ) 3>&1 1>&2 2>&3 )