Frage Wie kann ich die Ausgabe des "time" -Befehls umleiten?


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

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

In der Datei kann ich die Ausgabe der ls Befehl, nicht das von time. Bitte erkläre, warum ich nicht konnte und wie das geht.


75
2018-03-09 12:32


Ursprung


Antworten:


Sie können die Zeitausgabe umleiten mit

(time ls) &> file

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


84
2018-03-09 12:34



keine Notwendigkeit, Subshell zu starten. Verwenden Sie auch einen Codeblock.

{ time ls; } 2> out.txt

oder

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

110
2018-03-09 13:14



Die Befehlszeit sendet ihre Ausgabe an STDERR (anstelle von STDOUT). Das 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

Dies 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, &> leitet beide um.


20
2018-03-09 13:05



Zeit ist Shell eingebaut und ich bin mir nicht sicher, ob es eine Möglichkeit gibt, es umzuleiten. Sie können jedoch verwenden /usr/bin/time stattdessen, die definitiv irgendwelche Ausgabenumleitungen annehmen.


9
2018-03-09 12:37



Wenn Sie die Ausgabe nicht mischen möchten time und der Befehl. Mit GNU-Zeit können Sie verwenden -o file mögen:

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

während tim ist Ausgabe der Zeit, out und err sind stdout und stderr aus grep.


3
2018-01-13 07:51



Der Grund, warum die Umleitung nicht zu funktionieren scheint time ist, dass es ein bash reserviertes Wort ist (kein eingebautes!), wenn es vor einer Pipeline verwendet wird. Bash (1):

Wenn das reservierte Wort einer Pipeline vorangeht, werden sowohl die verstrichene Zeit als auch die Zeit überschritten   Benutzer- und Systemzeit, die bei ihrer Ausführung verbraucht wurde, werden gemeldet, wenn der   Pipeline wird beendet.

Also, um die Ausgabe von umzuleiten timeVerwenden Sie geschweifte Klammern:

{ time ls; } 2> filename

Oder anrufen /usr/bin/time:

/usr/bin/time ls 2> filename

1
2018-03-02 09:38