捕获命令输出时遇到问题

捕获命令输出时遇到问题

我在捕获 Bash 中命令的输出时遇到一些问题。

我有一个 Bash 脚本来测试 C 程序......

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"

或者,在 shell 中进行重定向:

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

相关内容