コマンド出力の取得に問題があります。

コマンド出力の取得に問題があります。

Bashでコマンド出力をキャプチャする際にはいくつかの問題があります。

CプログラムをテストするためのBashスクリプトがあります...

bufsize=1
while [ $bufsize -le 16384 ]
do
    runtime=$(/usr/bin/time -f "%e" -o /dev/tty \
    ./raw_copy $bufsize ./country_vaccinations.csv raw_copy.out)
    
    echo "Runtime for array with $bufsize slots was $runtime."
    
    bufsize=$(( $bufsize * 2 ))
done

raw_copy(プログラムが使用できるメモリ量に基づいて、私たちが書いているプログラムがどれだけ早くファイルをコピーできるかをテストします。宿題です。)

time私はコマンドの出力をという変数にキャプチャするいくつかの異なるバリエーションを試しましたruntime。たとえば、runtime=$(stuff)上記のようにruntime="$(stuff)"コマンドの引用符も変更しますecho。しかし、私は私が探しているものを確実に得ることはできません。私が得た結果は次のとおりです。

$ ./test4.sh 
0.60
Runtime for array with 1 slots was .
0.30
Runtime for array with 2 slots was .
0.15
Runtime for array with 4 slots was .
0.07
Runtime for array with 8 slots was .
0.04
Runtime for array with 16 slots was .
0.01
Runtime for array with 32 slots was .
0.01
Runtime for array with 64 slots was .

(et cetera)

ご存知のように、私は次のようなものを探しています。

$ ./test4.sh
Runtime for array with 1 slots was 0.60.
Runtime for array with 2 slots was 0.30.

(et cetera)

誰かが私を助けることができるかどうかを確認したかった。 (そのため、本質的にtimeコマンドの出力を印刷するのではなく、変数に保存する方法を理解するのが困難です。)

答え1

デフォルトでは、少なくともtime私のDebianはstderrに出力しますが、これはコマンドの置き換えには使用できません。コマンド/dev/ttyが端末に直接印刷するように指示しても、これは機能しません。

次の住所に印刷するように指示してください/dev/stdout

t=$(/usr/bin/time -f "%e" -o /dev/stdout sleep 1)
echo "that took $t s"

またはシェルからリダイレクトします。

t=$(/usr/bin/time -f "%e" sleep 1 2>&1)

関連情報