Ich habe einen Schlüsselwortbefehl für die Bash-Zeit, den ich nicht vollständig erklären kann, aber er funktioniert bei mir.
Mein Ziel:
-
um die Ausführungszeit eines Python-Skripts zu finden, das übrigens eine Variable aus einem Bash-Skript nimmt, und diesen Wert zu erfassen.
-
auch zum Erfassen der Ausgabe des Python-Skripts in derselben Variablen für die Erfolgs- oder Fehleranalyse.
Nachdem ich herumgelesen hatte, landete ich bei diesem Befehl, aber ich bin nicht in der Lage, ihn vollständig zu erklären.
ttime=$( (TIMEFORMAT="%U^"; time /../myscript.py ${__myvar} 2>&1 )|& tr -d f)
Können Sie erklären, warum ich den zweiten Befehl tr -d f
benötige in der Pipe, damit der Zeitwert an die Ausgabe des Befehls angehängt wird,
Die Wahl von 'tr -d f' war völlig willkürlich und wirkt sich nicht auf die Ausgabe meines Skripts aus, std oder err, aber ohne es oder einen anderen Befehl, der sich geringfügig auf die Textausgabe des Skripts auswirkt, sehe ich die Rückkehr von Python ohne angehängte Zeit, warum?
Bearbeiten:
Die eigentliche Frage hätte lauten sollen, warum das |& tr -d f
ist . benötigt, und wie Stephanie sagt, ist es das |&, das es ermöglicht, dass die im Schlüsselwort sterr gefundenen Timings in die Pipeline-Ausgabe geleitet werden
Die Lösung sieht jetzt so aus:
ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )
Tutorial für Felddeskriptoren:
http://wiki.bash-hackers.org/howto/redirection_tutorial
Akzeptierte Antwort:
In bash
, wie in ksh
, time
ist ein Schlüsselwort (nicht eingebaut), das verwendet wird, um eine Pipeline zu timen (nicht nur einfache Befehle, es können auch zusammengesetzte Befehle zeitgesteuert werden).
In time cmd 2> something
, wir timen cmd 2> something
und die Ausgabe auf stderr ausgeben, aber auf die ursprüngliche stderr.
Sie müssen stderr vorher umleiten die time
Konstrukt wird aufgerufen. Was Sie mit Ihrem |&
tun das die stdout und stderr der Subshell time
umleitet ist eingelaufen, aber ein viel einfacherer Weg wäre:
time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)
Das beinhaltet keine Subshell (hier verwenden wir eine Befehlsgruppe stattdessen) noch einen zusätzlichen Befehl.
Beachten Sie das mit bash
:
time=$(time (cmd) 2>&1)
funktioniert zufällig. Ich würde mich nicht darauf verlassen, da es sich in zukünftigen Versionen ändern könnte und nicht in anderen Shells funktioniert, die eine time
haben Schlüsselwort.
Wenn Sie nur die Timing-Ausgabe in $time
wünschen (und nicht stdout oder stderr des Befehls), würden Sie Folgendes tun:
{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1