我正在尝试编写一个批处理脚本,它将两个.cpp文件作为命令行参数,编译它们然后测量它们的执行时间。
#!/bin/bash
error=0
g++ -O2 -std=c++11 $1 -o __gen
((error|=$?))
g++ -O2 -std=c++11 $2 -o __run
((error|=$?))
if (($error != 0)); then
echo 'Compilation failed'
rm __gen __run
exit 1;
fi
clear
echo 'Compilation was succesful'
time=0.0
until (( `bc <<< "$time > 1.5"` )); do
./__gen > in
time=$(/usr/bin/time -f "%e" ./__run < in > out)
done
第一个.cpp是测试生成器的源代码。它为第二个程序生成输入。我希望批次在第二次程序第一次运行超过1.5秒时停止。
当我运行脚本时,我得到(standard_in) 1: syntax error
。
你能救我吗?
答案 0 :(得分:0)
此命令:
/usr/bin/time -f "%e" ./__run < in > out
什么都不输出(因为整个stdout被重定向到文件out
,而time
命令将时间输出到stderr)。
因此,在循环的第一次迭代之后,变量time
变空。
然后"$time > 1.5"
评估为> 1.5
,导致bc
中的语法错误(>
的左操作数丢失)。
一种解决方案是使用-o
的{{1}}选项将时间写入临时文件,然后将该文件读入变量。
这也将消除程序/usr/bin/time
也向stderr输出数据的可能问题,这将再次破坏__run
的输入。