2012-11-01 5 views
9

Ich brauche die Zeit zum Schreiben genommen diesen Befehl in einer txt-Datei auszuführen:Bash-Skript schreibt Ausführungszeit in einer Datei

time ./program.exe 

Wie kann ich in Bash-Skript zu tun?

Ich versuche mit >> time.txt, aber das funktioniert nicht (die Ausgabe geht nicht zur Datei und geht auf den Bildschirm).

+1

mögliche Duplikate von [Struggling zu analysieren (Bash) Zeitbefehl] (http://StackOverflow.com/questions/3928430/Struggling-to-Parse-Bash-Time-Command) –

Antwort

18

Getting time in bash in eine Datei schreiben ist harte Arbeit. Es ist ein eingebauter Befehl bash. (Unter Mac OS X gibt es einen externen Befehl, /usr/bin/time, die eine ähnliche Arbeit erledigt, aber mit einem anderen Ausgabeformat und weniger Widerspenstigkeit.)

Sie müssen verwenden:

(time ./program.exe) 2> time.txt 

Es schreibt Standardfehler (daher die Notation 2>). Wenn Sie jedoch die Untershell (die Klammern) nicht verwenden, funktioniert es nicht; Die Ausgabe kommt immer noch auf den Bildschirm.


Alternativ und ohne Unterschale, können Sie verwenden:

{ time ./program.exe; } 2> time.txt 

Notieren Sie sich den Raum nach der offenen Klammer und dem Semikolon; beide sind in einer einzigen Zeile notwendig. Die geschweiften Klammern müssen dort erscheinen, wo ein Befehl erscheinen könnte, und müssen eigenständige Symbole sein. (Wenn Sie hart genug kämpfen, werden Sie mit ...;}|something oder ...;}2>&1 kommen. Beide von ihnen identifizieren die geschweifte Klammer als ein eigenständiges Symbol, wenn Sie versuchen ...;}xyz, wird die Shell (wahrscheinlich) finden Sie einen Befehl mit dem Namen }xyz, obwohl .; die Schale mit dem Skript kommt aus dem Argument der -c Option auszuführen ist

xterm -xrm '*hold: true' -e sh -c "(time ./Program.exe) 2> time.txt & sleep 2" 

der Schlüssel ändern:)


I need to run more command in more terminal. If I do this:

xterm -xrm '*hold: true' -e (time ./Program.exe) >> time.exe & sleep 2 

it doesn't work and tells me Syntax error: "(" unexpected . How do I fix this?

Sie wäre so etwas wie tun müssen, Sie können sh durch /bin/bash oder einen gleichwertigen Namen ersetzen. Das sollte alle 'Syntaxfehler'-Probleme umgehen. Ich bin mir nicht ganz sicher, was diesen Fehler auslöst, also könnte es einen einfacheren und besseren Weg geben, damit umzugehen. Es ist auch denkbar, dass xterm ‚s -e Option nur ein einziges String-Argument, in diesem Fall, ich nehme an, Sie verwenden würden:

xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"' 

Sie können manuelle bash xterm so gut wie ich kann.

Ich bin mir nicht sicher, warum Sie das zeitgesteuerte Programm im Hintergrundmodus ausführen, aber das ist Ihr Problem, nicht meins. Ebenso ist die sleep 2 nicht offensichtlich notwendig, wenn die hold: true das Terminal offen hält.

+0

Ich brauche mehr Befehl in mehr auszuführen Terminal. Wenn ich dies tue xterm -xrm '* halten: true' -e (Zeit ./Program.exe) 2> time.exe & sleep 2 funktionieren nicht und sagen Sie mir Syntaxfehler: "(" Unerwartetes – NikM

0

Es ist nicht einfach, die Ausgabe der bash eingebauten time umleiten.

Eine Lösung ist das externe time Programm zu verwenden:

/bin/time --append -o time.txt ./program.exe 

(auf den meisten Systemen ist es ein GNU Programm, so info time zu verwenden, anstatt man seine Dokumentation zu bekommen).

+0

Hinweis: Dies funktioniert nicht mit bash-Funktionen Das Argument für GNU 'time' muss ein Befehl sein, der in Ihrem Pfad verfügbar ist. – tjameson

0

time_elapsed = (time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}' Echo time_elapsed> file.txt Dieser Befehl sollten Sie die genaue Zeit in bash in einer gewünschten Datei verbraucht geben ..

Sie können auch diese usng in eine Datei umleiten 2> file.txt wie in einer anderen Antwort erklärt.

0

umschließen Sie einfach den Befehl zu der Zeit in einem { .. }:

{ time ./program.exe; } 2>&1 

Natürlich ist die Ausgabe von builtin Zeit nach stderr geht, damit die benötigte Umleitung 2>&1.

Dann kann es schwierig sein, erscheint die Ausgabe zu erfassen, lassen Sie sich eine zweites { .. } verwenden Sie den Befehl leichter zu lesen, das funktioniert:

{ { time ./program.exe; } 2>&1; } >> time.txt    # This works. 

jedoch das korrekte Konstrukt einfach soll die Erfassung umgekehrt , wie folgt aus:

{ time ./program.exe; } >> time.txt 2>&1;     # Correct. 

um eine mögliche Ausgabe des Befehls zu schließen, umleiten es Ausgabe nach/dev/null, wie folgt aus:

Und wie jetzt nur noch die Ausgabe auf stderr ist, könnten wir einfach erfassen nur sie:

{ time ./program.exe >/dev/null 2>&1; } 2>> time.txt  # Best. 

Die Ausgabe von ./program umgeleitet werden soll, oder es kann auch innerhalb time.txt beenden.