私はこれを試しています:
TIMEFORMAT=%R;
foo=$(time wget http://www.mysite.com)
echo $foo
実行すると、出力には必要な数が表示されますが、変数fooには表示されません(echo $ fooは何も出力しません)。
何故ですか?
に出力を送信する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 )