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.

abubacker
quelle
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
1
Mögliches Duplikat von Gibt es eine Möglichkeit, die
Zeitausgabe unter

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.

Sganesh
quelle
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
Ghostdog74
quelle
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.

Mnementh
quelle
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.

Michal Čihař
quelle
/ 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.

Ding-Yi Chen
quelle
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
user1338062
quelle
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
cognativeorc
quelle