7

私はこれを試しています:

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

実行すると、出力には必要な数が表示されますが、変数fooには表示されません(echo $ fooは何も出力しません)。

何故ですか?

4

1 に答える 1

12

に出力を送信するfooため、何もキャプチャしていません。問題は、コマンドがその出力のほとんどをに送信することです。2つのストリームを分割する(そしてからの出力を破棄する)には、サブシェルを使用する必要があります。timestderrwgetstderrwget

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 )
于 2012-08-08T16:29:09.597 に答える