我正在尝试这个:
TIMEFORMAT=%R;
foo=$(time wget http://www.mysite.com)
echo $foo
当我执行时,我在输出中看到了我想要的数字,但在变量 foo 中没有(echo $foo 什么都不打印)。
这是为什么?
您没有捕获任何内容,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
以便它可以被命令替换( $()
) 捕获。
更新:
如果您想变得非常聪明,可以通过像这样处理文件描述符wget
来传递传递到的输出:stderr
foo=$( time ( wget http://www.example.com 2>&1 ) 3>&1 1>&2 2>&3 )