Ich möchte einen time
Befehl ausführen , um die Zeit mehrerer Befehle zu messen.
Was ich machen möchte ist:
- Messen Sie die Laufzeit von allen zusammen
- Schreiben Sie die
time
Ausgabe in eine Datei - Schreiben Sie das
STDERR
aus dem Befehl, den ich zu messen binSTDERR
Was ich NICHT tun möchte, ist
- Schreiben Sie die mehrere Befehle in einem separaten Skript (warum? Weil all dies ist bereits ein Skript , das ich programmatisch bin zu erzeugen, und die Schaffung von ANOTHER temporäre Skript würde mehr Chaos als ich will)
Was ich bisher versucht habe:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Funktioniert nicht, time
wird nur auf dem ersten ausgeführt.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
Funktioniert nicht, (
ist unerwartetes Token.
/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
Funktioniert nicht, "keine solche Datei oder Verzeichnis".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Funktioniert nicht, "keine solche Datei oder Verzeichnis".
time ( echo "a"; echo "b"; ) 2>outtime
Funktioniert nicht, da es alle STDERR
in umleitet outtime
; Ich möchte nur die time
Ausgabe dort.
Und natürlich,
time --output=outime echo "a";
Funktioniert seitdem nicht mehr --output=outime: command not found
.
Wie kann ich es tun?
quelle
time -p sh -c 'echo "a"; echo "b"'
Versuche dies:
Erläuterung:
Zuerst müssen wir einen Weg finden, die Ausgabe von umzuleiten
time
. Datime
es sich um eine integrierte Shell handelt, wird die vollständige Befehlszeile als zu messender Befehl verwendet, einschließlich Umleitungen. Somit,[Anmerkung: Janos 'Kommentar impliziert, dass dies nicht der Fall ist
bash
.] Wir können die Umleitung dertime
Ausgabe von erreichen, indem wirtime
in einer Subshell ausführen und dann die Ausgabe dieser Subshell umleiten.Jetzt haben wir die Ausgabe von erfolgreich umgeleitet
time
, aber ihre Ausgabe wird mit der Fehlerausgabe des gemessenen Befehls gemischt. Um die beiden zu trennen, verwenden wir einen zusätzlichen Dateideskriptor.Auf der "Außenseite" haben wir
Dies bedeutet: Was auch immer in Dateideskriptor 3 geschrieben ist, wird an derselben Stelle ausgegeben, an der jetzt Dateideskriptor 2 (Standardfehler) ausgegeben wird (das Terminal). Und dann leiten wir Standardfehler in die Datei um
timeout
.Jetzt haben wir also: Alles, was in stdout und fd 3 geschrieben ist, wird zum Terminal und alles, was in stderr geschrieben ist, wird in die Datei geschrieben. Was bleibt, ist die Umleitung des Stderr des gemessenen Befehls zu fd 3.
Damit die Zeit mehr als einen Befehl misst, müssen wir sie in einer (anderen!) Unterschale (in Klammern) ausführen. Und um die Fehlerausgabe von allen nach fd 3 umzuleiten, müssen wir sie in geschweiften Klammern gruppieren.
Also, endlich kommen wir zu:
Das ist es.
quelle
Nicht die richtige Antwort, aber sehr auf die Frage bezogen.
Timing-Statistiken für mehrere Programme abrufen. Kombinierte Klammern sind erforderlich. Kommandos mit Semikolon trennen.
quelle
time ( command1 && command2 )
, falls der erste Befehl fehlschlägt. es wird nicht mit der Ausführung des anderen fortfahren.