我正在尝试这个:
TIMEFORMAT=%R; foo=$(time wget http://www.mysite.com) echo $foo
当我执行时,我会在输出中看到我想要的数字,但不会在变量foo中看到(echo $foo什么都不打印).
这是为什么?
你没有在foo中捕获任何东西,因为时间在stderr上发送它的输出.问题是wget命令还在stderr上发送了大部分输出.要拆分两个流(并丢弃wget的输出),您需要使用
subshell:
TIMEFORMAT=%R; foo=$( time ( wget http://www.example.com 2>/dev/null 1>&2 ) 2>&1 ) echo $foo
这是对正在发生的事情的解释……
这个命令的内部部分:
( wget http://www.example.com 2>/dev/null 1>&2 )
将stderr和stdout发送到/ dev / null,基本上将它们丢弃.
外部:
foo=$( time ( ... ) 2>&1 )
将stderr从time命令发送到stdout发送到的相同位置,以便它可以被command substitution($())捕获.
更新:
如果你想变得非常聪明,可以通过像这样处理文件描述符来将wget的输出传递给stderr:
foo=$( time ( wget http://www.example.com 2>&1 ) 3>&1 1>&2 2>&3 )