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)