In ksh
, bash
und zsh
, time
ist kein Befehl (builtin oder nicht), es ist ein reserviertes Wort in der Sprache wie for
oder while
.
Es wird verwendet, um eine Pipeline 1 zeitlich zu bestimmen .
Im:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
Sie haben eine spezielle Syntax, die die Shell anweist, diese Pipeline auszuführen:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
Und Timing-Statistiken dafür melden.
Im:
time cmd > output 2> error
Es ist dasselbe, Sie planen den cmd > output 2> error
Befehl und die Timing-Statistiken beziehen sich immer noch auf den Stderr der Shell.
Du brauchst:
{ time cmd > output 2> error; } 2> timing-output
Oder:
exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-
Damit das stderr der Shell umgeleitet wird, timing-output
bevor das time-Konstrukt (wieder kein Befehl ) verwendet wird (hier zur Zeit cmd > output 2> error 3>&-
).
Sie können dieses time
Konstrukt auch in einer Subshell ausführen , deren stderr umgeleitet wird:
(time cmd > output 2> error) 2> timing-output
Diese Subshell ist hier jedoch nicht erforderlich. Sie müssen nur stderr zum Zeitpunkt des Aufrufs des time
Konstrukts umleiten .
Die meisten Systeme haben auch einen time
Befehl. Sie können dieses aufrufen, indem Sie das time
Schlüsselwort deaktivieren . Alles, was Sie tun müssen, ist, dieses Schlüsselwort in Anführungszeichen zu setzen, da Schlüsselwörter nur als solche erkannt werden, wenn sie wörtlich sind.
'time' cmd > output 2> error-and-timing-output
Beachten Sie jedoch, dass das Format und der Stderr von beiden unterschiedlich sein können time
und cmd
zusammengeführt werden error-and-timing-output
.
Außerdem kann der time
Befehl im Gegensatz zum time
Konstrukt keine Pipelines oder zusammengesetzten Befehle oder Funktionen oder Shell-Builtins zeitlich festlegen ...
Wenn es sich um einen eingebauten Befehl handelt, kann er möglicherweise Funktionsaufrufe oder eingebaute Befehle zeitlich festlegen, jedoch keine Zeitumleitungen, Pipelines oder Verbundbefehle.
1 Beachten Sie, dass bash
(was als) ein Fehler vorliegt, bei dem time (cmd) 2> file
(aber nicht time cmd | (cmd2) 2> file
zum Beispiel) die Timing-Ausgabe an umgeleitet wirdfile
time
es sich um das Shell-Schlüsselwort handelt oder/usr/bin/time
. Möglicherweise sind hier mehrere Deskriptorsätze beteiligt (die der Shell und die, die an einentime
Prozess gebunden sind). Und vergessen wir nicht die von der()
Unterschale implizierten . ( Warten auf einen Bash-Spezialisten : p)