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

use*_*722 7 bash shell time wget

我正在尝试这个:

TIMEFORMAT=%R;
foo=$(time wget http://www.mysite.com)
echo $foo
Run Code Online (Sandbox Code Playgroud)

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

这是为什么?

Lee*_*ton 11

您没有捕获任何内容foo因为time发送其输出stderr.问题是该wget命令还会发送大部分输出stderr.要拆分两个流(并丢弃输出wget),您需要使用子shell:

TIMEFORMAT=%R;
foo=$( time ( wget http://www.example.com 2>/dev/null 1>&2 ) 2>&1 )
echo $foo
Run Code Online (Sandbox Code Playgroud)

这是对正在发生的事情的解释......

这个命令的内部部分:

( wget http://www.example.com 2>/dev/null 1>&2 )
Run Code Online (Sandbox Code Playgroud)

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

外部:

foo=$( time ( ... ) 2>&1 )
Run Code Online (Sandbox Code Playgroud)

stderrtime命令发送到发送的相同位置,stdout以便命令substitution($())可以捕获它.

更新:

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

foo=$( time ( wget http://www.example.com 2>&1 ) 3>&1 1>&2 2>&3 )
Run Code Online (Sandbox Code Playgroud)