Wie kann ich die Ausgabe des Befehls "Zeit" umleiten?


94

Ich habe versucht, die Ausgabe des Zeitbefehls umzuleiten, konnte aber nicht:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

In der Datei kann ich die Ausgabe des lsBefehls sehen, nicht die von time. Bitte erklären Sie, warum ich nicht konnte und wie das geht.


1
Sollte auf Superuser sein, denke ich.
Mnementh

1
Die Antwort auf diese Frage ist nicht nur von Interesse für Programmierer, sondern auch für andere Power-User: superuser.com
Mnementh

Antworten:


103

Sie können die Zeitausgabe mit umleiten,

(time ls) &> file

Weil Sie (Zeit ls) als einen einzigen Befehl nehmen müssen, damit Sie geschweifte Klammern verwenden können.


1
Ja, wirklich gut, aber die Frage ist, wie sie das gemacht haben.
Abubacker

2
Der Befehl time nimmt die Argumente als Befehl. In Klammern wird dies jedoch als ein Befehl zusammengefasst. Beispiel: Zeit ls> file1.txt In Argumenten ist 0 = Zeit 1 = "ls> file1.txt"
sganesh

8
Der Befehl time gibt die Ausgabe in stderr aus. So können Sie (Zeit ls) 2> Datei
Sganesh

4
Klarstellung &>bitte, wo kann ich davon erfahren?
hallo_there_andy

3
@hello_there_andy &>fileist analog zu >file 2>&1. Es steuert sowohl stdout als auch stderr.
ktbiz

127

Sub-Shell muss nicht gestartet werden. Verwenden Sie auch einen Codeblock.

{ time ls; } 2> out.txt

oder

{ time ls > /dev/null 2>&1 ; } 2> out.txt

1
Einverstanden, beste Antwort. Bietet Ihnen die Möglichkeit, die ls-Ergebnisse fallen zu lassen und nur die Zeit zu bekommen. Vielen Dank, dass Sie Ghostdog74
Rd42

1
Dies funktionierte mit AIX, wenn nichts die Ausgabe des Befehls "hostent" umleiten konnte. Danke dir!
Hugo

1
Klarstellung zum 2>bitte. Wo kann ich davon erfahren?
hallo_there_andy

3
Wie mache ich das, wenn ich gleichzeitig> und 2> möchte?
Jorge Fernández

25

Die Befehlszeit sendet ihre Ausgabe an STDERR (anstelle von STDOUT). Dies liegt daran, dass der Befehl, der normalerweise mit der Zeit ausgeführt wird (in diesem Fall ls), an STDOUT ausgegeben wird.

Wenn Sie die Ausgabe der Zeit erfassen möchten, geben Sie Folgendes ein:

(time ls) 2> filename

Das erfasst nur die Ausgabe der Zeit, aber die Ausgabe von ls geht normal zur Konsole. Wenn Sie beide in einer Datei erfassen möchten, geben Sie Folgendes ein:

(time ls) &> filename

2> leitet STDERR um und> leitet beide um.


1
Diese Antwort beantwortet tatsächlich, warum die Weiterleitung des OP nicht funktionierte, was eine der Fragen war, die das OP stellte. Niemand sonst spricht dies an.
NeutronStar

Wie würde ein Pipe zu einem anderen Prozess damit?
Paul

10

Die Zeit ist in die Shell eingebaut und ich bin mir nicht sicher, ob es eine Möglichkeit gibt, sie umzuleiten. Sie können jedoch /usr/bin/timestattdessen verwenden, die definitiv alle Umleitungen der Ausgabe akzeptieren.


/ usr / bin / time - Ausgabe Dateiname ls
Chub

4
Die eingebaute Zeit funktioniert gut mit der Ausgabeumleitung. Es wird nur auf STDERR ausgegeben, nicht auf STDOUT.
Mnementh

Das Problem ist, dass integrierte Befehle in der Shell-Umgebung selbst ausgeführt werden und nicht in einer Subshell. Da der stderr Ihrer Shell normalerweise mit dem Terminal verbunden ist, führt die Umleitung nichts aus. Ich glaube, Sie müssten so etwas tun, um die eingebaute Zeit umzuleiten bash time mycmd 2>file. Oder einfach anrufen/usr/bin/time wie bereits erwähnt.
Ktbiz

Sie können das nicht integrierte Element auch verwenden, ohne den vollständigen Pfad anzugeben: stackoverflow.com/questions/29540540/…
Ciro Santilli 18 冠状 病 六四 事件 4

4

Wenn Sie die Ausgabe von timeund den Befehl nicht mischen möchten . Mit GNU-Zeit können Sie Folgendes verwenden -o file:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

while timwird von der Zeit ausgegeben outund errist stdout und stderr von grep.


4

Der Grund, warum die Umleitung nicht zu funktionieren scheint time ist, dass es sich um ein reserviertes Bash-Wort handelt (nicht um ein eingebautes!), Wenn es vor einer Pipeline verwendet wird. Bash (1):

Wenn das zeitreservierte Wort vor einer Pipeline steht, werden die verstrichene sowie die von seiner Ausführung verbrauchte Benutzer- und Systemzeit beim Beenden der Pipeline gemeldet.

Um die Ausgabe von umzuleiten time, verwenden Sie entweder geschweifte Klammern:

{ time ls; } 2> filename

Oder rufen Sie an /usr/bin/time:

/usr/bin/time ls 2> filename

0

Ich benutze die Umleitung von stdout und stderr Methode mit geschweiften Klammern zum Testen.
Das &>>rptrepräsentiert dies >>rpt 2>&1aber kürzer.
Die geschweiften Klammern führen einen oder mehrere Befehle in der aktuellen Shell aus. Siehe: Mann schlagen

{ time ls a*; } &>>rpt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.