In ksh, bashund zsh, timeist kein Befehl (builtin oder nicht), es ist ein reserviertes Wort in der Sprache wie foroder 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> errorBefehl 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-outputbevor das time-Konstrukt (wieder kein Befehl ) verwendet wird (hier zur Zeit cmd > output 2> error 3>&-).
Sie können dieses timeKonstrukt 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 timeKonstrukts umleiten .
Die meisten Systeme haben auch einen timeBefehl. Sie können dieses aufrufen, indem Sie das timeSchlü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 timeund cmdzusammengeführt werden error-and-timing-output.
Außerdem kann der timeBefehl im Gegensatz zum timeKonstrukt 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> filezum Beispiel) die Timing-Ausgabe an umgeleitet wirdfile
timees 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 einentimeProzess gebunden sind). Und vergessen wir nicht die von der()Unterschale implizierten . ( Warten auf einen Bash-Spezialisten : p)