私はこれを試しています:
TIMEFORMAT=%R;
foo=$(time wget http://www.mysite.com)
echo $foo
実行すると、出力には必要な数が表示されますが、変数fooには表示されません(echo $ fooは何も出力しません)。
何故ですか?
に出力を送信するfoo
ため、何もキャプチャしていません。問題は、コマンドがその出力のほとんどをに送信することです。2つのストリームを分割する(そしてからの出力を破棄する)には、サブシェルを使用する必要があります。time
stderr
wget
stderr
wget
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 )