2016-07-05 2 views
0

Ich versuche, ein Batch-Skript zu schreiben, die als Befehlszeilenargumente zwei .cpp-Dateien, kompiliert sie und dann ihre Ausführungszeiten messen.(Standard_in) 1: Syntaxfehler in einem Bash-Skript

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

Die erste .cpp ist Quellcode für einen Testgenerator. Es erzeugt eine Eingabe für das zweite Programm. Ich möchte, dass der Stapel aufhört, wenn das zweite Programm zum ersten Mal länger als 1,5 Sekunden ausgeführt wird.

Wenn ich das Skript ausführen, bekomme ich (standard_in) 1: syntax error. Können Sie mir helfen?

Antwort

0

Dieser Befehl:

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

Ausgänge nichts (weil die ganze stdout umgeleitet wird out Datei und die time Befehl gibt die Zeit nach stderr). Somit wird die Variable time nach der ersten Iteration der Schleife leer. Dann "$time > 1.5" wertet > 1.5 aus, was einen Syntaxfehler in bc verursacht (linker Operand von > fehlt).

Eine Lösung wäre, die -o Option von /usr/bin/time zu verwenden, um die Zeit in eine temporäre Datei zu schreiben und später diese Datei in die Variable einzulesen. Dadurch werden auch mögliche Probleme behoben, bei denen das Programm __run auch Daten an stderr ausgibt, die wiederum den Eingang zu bc verfälschen würden.

+0

Vielen Dank! Aber wie kann ich das beheben? ./__run erzeugt eine Ausgabe, die nicht im Terminal angezeigt werden soll, und keine Zeitvariable – manolismi