Ich möchte nur die Ausgabe eines Zeitbefehls erfassen, dh:
X=$(time ls)
oder
$(time ls) | grep real
Die Zeitfunktion spuckt es jedoch auf die Konsole. Wie mache ich das?
Ich möchte nur die Ausgabe eines Zeitbefehls erfassen, dh:
X=$(time ls)
oder
$(time ls) | grep real
Die Zeitfunktion spuckt es jedoch auf die Konsole. Wie mache ich das?
Antworten:
Siehe BashFAQ / 032 .
$ # captures output of command and time
$ time=$( TIMEFORMAT="%R"; { time ls; } 2>&1 ) # note the curly braces
$ # captures the time only, passes stdout through
$ exec 3>&1 4>&2
$ time=$(TIMEFORMAT="%R"; { time ls 1>&3 2>&4; } 2>&1)
bar baz
$ exec 3>&- 4>&-
Die Zeit wird wie "0.000" aussehen, wobei TIMEFORMAT="%R"
"Echtzeit" verwendet wird.
exec
Befehl in meiner Antwort unter Verwendung der verfügbaren Dateideskriptoren erstellt wurden. Beliebige verfügbare Dateideskriptoren könnten verwendet werden. Streams 3 und 4 sind Kopien von 1 ( stdout
) bzw. 2 ( stderr
). Dies ermöglicht, dass die Ausgabe von ls
normal an stdout
und stderr
über 3 und 4 übergeben wird, während die Ausgabe von time
(die normalerweise an geht stderr
) zum Original stdout
(1) umgeleitet und dann in der Variablen unter Verwendung der Befehlssubstitution erfasst wird. Wie Sie in meinem Beispiel sehen können, werden die Dateinamen bar
und baz
auf dem Terminal ausgegeben. ...
-
.
Die Zeit schreibt ihre Ausgabe eher in STDERR als in STDOUT. Erschwerend kommt hinzu, dass 'time' standardmäßig ein Shell-Befehl ist. Wenn Sie also 'time ls 2> & 1' versuchen, gilt '2> & 1' nur für 'ls'.
Die Lösung wäre wahrscheinlich so etwas wie:
/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')
Es gibt ausgefallenere Möglichkeiten, dies zu tun, aber das ist der klare / einfache Weg.
@Dennis Williamsons Antwort ist großartig, aber es hilft Ihnen nicht, die Ausgabe des Befehls in einer Variablen und die Ausgabe time
in einer anderen Variablen zu speichern . Dies ist mit Dateideskriptoren eigentlich nicht möglich.
Wenn Sie aufzeichnen möchten, wie lange die Ausführung eines Programms dauert, können Sie dies tun, indem Sie einfach die Startzeit von der Endzeit subtrahieren. Hier ist ein einfaches Beispiel, das zeigt, wie viele Millisekunden ein Programm benötigt hat:
START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
Dies ist nicht ganz so genau wie der time
Befehl, sollte aber für die meisten Bash-Skripte einwandfrei funktionieren.
Leider unterstützt Macs date
Befehl das %N
Format nicht, aber Sie können installieren coreutils
( brew install coreutils
) und verwenden gdate
:
START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
time
; Dennis Williamsons Antwort ist in dieser Hinsicht besser.