我正在尝试这个:
TIMEFORMAT=%R;
foo=$(time wget http://www.mysite.com)
echo $foo
当我执行时,我会在输出中看到我想要的数字,但不会在变量foo中看到(echo $ foo什么都不打印)。
为什么?
答案 0 :(得分:11)
您未在foo
中捕获任何内容,因为time
会在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 )