2016-07-05 928 views
0

我想写一个批处理脚本,它需要两个.cpp文件作为命令行参数,编译它们然后测量它们的执行时间。(standard_in)1:在bash脚本中的语法错误

#!/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

此命令:

/usr/bin/time -f "%e" ./__run <in> out 

输出无关(因为整个标准输出被重定向到文件out,并且time命令输出的时间到stderr)。 因此,变量time在循环的第一次迭代后变空。 然后"$time > 1.5"评估为> 1.5,这导致bc中的语法错误(缺少>的左操作数)。

一种解决方案是使用-o选项/usr/bin/time将时间写入临时文件,然后将该文件读入变量。 这也将消除程序__run也向stderr输出数据时可能出现的问题,这会再次损坏输入到bc

+0

谢谢!但我该如何解决这个问题? ./__run产生我不希望在终端中显示的输出,既不去时间变量 – manolismi