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)
发送stderr
和stdout
发送/dev/null
,基本上将它们丢弃.
外部:
foo=$( time ( ... ) 2>&1 )
Run Code Online (Sandbox Code Playgroud)
stderr
从time
命令发送到发送的相同位置,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)