捕获脚本变量中的bash时间输出

时间:2012-08-08 16:17:35

标签: bash shell time wget

我正在尝试这个:

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

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

为什么?

1 个答案:

答案 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 )

stderrstdout发送到/dev/null,基本上将它们丢弃。

外部:

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

stderr命令发送timestdout发送到的同一位置,以便command substitution$())捕获它。

<强>更新

如果你想变得非常聪明,你可以通过像这样处理文件描述符来将wget的输出传递给stderr

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