En ksh
, bash
y zsh
, time
no es un comando (incorporado o no), es una palabra reservada en el idioma como for
owhile
.
Se usa para cronometrar una tubería 1 .
En:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
Tiene una sintaxis especial que le dice al shell que ejecute esa tubería:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
E informe estadísticas de tiempo para ello.
En:
time cmd > output 2> error
Es lo mismo, estás temporización de lacmd > output 2> error
comando y las estadísticas de cronometraje siguen en el stderr del shell.
Necesitas:
{ time cmd > output 2> error; } 2> timing-output
O:
exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-
Para que se redireccione stderr del shell timing-output
antes de que se use la construcción de tiempo (nuevamente, no comando ) (aquí de vez en cuandocmd > output 2> error 3>&-
).
También puede ejecutar esa time
construcción en una subshell que tiene su stderr redirigido:
(time cmd > output 2> error) 2> timing-output
Pero esa subshell no es necesaria aquí, solo necesita que se redireccione stderr en el momento en que time
se invoca la construcción.
La mayoría de los sistemas también tienen un time
comando. Puede invocarlo deshabilitando la time
palabra clave. Todo lo que necesita hacer es citar esa palabra clave de alguna manera, ya que las palabras clave solo se reconocen como tales cuando son literales.
'time' cmd > output 2> error-and-timing-output
Pero cuidado, el formato puede ser diferente y el más antiguo de ambos time
y cmd
se fusionará error-and-timing-output
.
Además, el time
comando, a diferencia deltime
construcción, no puede cronometrar tuberías o comandos compuestos o funciones o funciones integradas de shell ...
Si se tratara de un comando incorporado, podría ser capaz de cronometrar invocaciones de funciones o incorporados, pero no podría cronometrar redireccionamientos o canalizaciones o comandos compuestos.
1 Tenga en cuenta que bash
tiene (lo que se puede considerar como) un error por el cual time (cmd) 2> file
(pero no time cmd | (cmd2) 2> file
por ejemplo) redirige la salida de temporización afile
time
es la palabra clave de shell o/usr/bin/time
. Puede haber varios conjuntos de descriptores involucrados aquí (el shell y los adjuntos a untime
proceso). Y no nos olvidemos de los implicados por la()
subshell. ( esperando un especialista en bash : p)