$ # 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>&14>&2
$ time=$(TIMEFORMAT="%R";{ time ls 1>&32>&4;}2>&1)
bar baz
$ exec 3>&-4>&-
Die Zeit wird wie "0.000" aussehen, wobei TIMEFORMAT="%R""Echtzeit" verwendet wird.
Könntest du ein wenig erklären, wie das funktioniert? Ich verwende seit Jahren einen Ausschnitt wie diesen Frachtkultstil. Was ist Stream 3 und 4? und die '-' ?
Sirex
1
@ Sirex: Streams 3 und 4 sind Streams, die vom execBefehl 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 lsnormal an stdoutund 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 barund bazauf dem Terminal ausgegeben. ...
Bis auf weiteres angehalten.
1
... Wenn Sie fertig sind, werden die zusätzlichen Streams mit dem Trailing geschlossen -.
Bis auf weiteres angehalten.
4
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'.
Ich bin daran interessiert, dies ohne -o zu tun. Kannst du eine der ausgefallenen Methoden posten, an die du gedacht hast :)?
David Doria
0
@Dennis Williamsons Antwort ist großartig, aber es hilft Ihnen nicht, die Ausgabe des Befehls in einer Variablen und die Ausgabe timein 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:
time
; Dennis Williamsons Antwort ist in dieser Hinsicht besser.Siehe BashFAQ / 032 .
Die Zeit wird wie "0.000" aussehen, wobei
TIMEFORMAT="%R"
"Echtzeit" verwendet wird.quelle
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 vonls
normal anstdout
undstderr
über 3 und 4 übergeben wird, während die Ausgabe vontime
(die normalerweise an gehtstderr
) zum Originalstdout
(1) umgeleitet und dann in der Variablen unter Verwendung der Befehlssubstitution erfasst wird. Wie Sie in meinem Beispiel sehen können, werden die Dateinamenbar
undbaz
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:
Es gibt ausgefallenere Möglichkeiten, dies zu tun, aber das ist der klare / einfache Weg.
quelle
@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:
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 installierencoreutils
(brew install coreutils
) und verwendengdate
:quelle