7

我正在尝试这个:

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

当我执行时,我在输出中看到了我想要的数字,但在变量 foo 中没有(echo $foo 什么都不打印)。

这是为什么?

4

1 回答 1

12

您没有捕获任何内容,foo因为time将其输出发送到stderr. 问题是该wget命令还将其大部分输出发送到stderr. 要拆分两个流(并丢弃来自 的输出wget),您需要使用subshel​​l

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 )

同时发送stderrstdout/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 )
于 2012-08-08T16:29:09.597 回答