$ # captures output of command and time
$ time=$( TIMEFORMAT="%R";{ time ls;}2>&1)# note the curly braces
$ # captures the time only, passes stdout through
$ exec 3>&14>&2
$ time=$(TIMEFORMAT="%R";{ time ls 1>&32>&4;}2>&1)
bar baz
$ exec 3>&-4>&-
El tiempo se verá como "0.000" usando TIMEFORMAT="%R"cuál será el tiempo "real".
¿podrías explicar un poco cómo funciona esto? He usado un fragmento como este estilo de culto de carga durante años. ¿Cuál es la secuencia 3 y 4? y el '-' ?
Sirex
1
@Sirex: las secuencias 3 y 4 son secuencias creadas por el execcomando en mi respuesta utilizando los descriptores de archivo disponibles. Cualquier descriptor de archivo disponible podría ser utilizado. Las secuencias 3 y 4 son copias de 1 ( stdout) y 2 ( stderr), respectivamente. Esto permite la salida de lspasar normalmente a stdouty stderra través de 3 y 4 mientras que la salida de time(que normalmente va a stderr) se redirige a la original stdout(1) y, a continuación capturada en la variable mediante la sustitución de comandos. Como puede ver en mi ejemplo, los nombres de los archivos bary bazse envían al terminal. ...
Pausado hasta nuevo aviso.
1
... Una vez finalizado, las secuencias adicionales se cierran utilizando el seguimiento -.
Pausado hasta nuevo aviso.
4
Time escribe su salida en STDERR en lugar de STDOUT. Para empeorar las cosas, por defecto 'time' es un comando integrado de shell, por lo que si intenta 'time ls 2> & 1', '2> & 1' solo se aplica a 'ls'.
Estoy interesado en hacer esto sin -o. ¿Puedes publicar uno de los elegantes métodos en los que estabas pensando :)?
David Doria
0
La respuesta de @Dennis Williamson es excelente, pero no le ayuda a almacenar la salida del comando en una variable y la salida de timeotra variable. En realidad, esto no es posible utilizando descriptores de archivo.
Si desea registrar cuánto tiempo tarda un programa en ejecutarse, puede hacerlo simplemente restando la hora de inicio de la hora de finalización. Aquí hay un ejemplo simple que muestra cuántos milisegundos tardó un programa en ejecutarse:
time
; La respuesta de Dennis Williamson es mejor en ese sentido.Ver BashFAQ / 032 .
El tiempo se verá como "0.000" usando
TIMEFORMAT="%R"
cuál será el tiempo "real".fuente
exec
comando en mi respuesta utilizando los descriptores de archivo disponibles. Cualquier descriptor de archivo disponible podría ser utilizado. Las secuencias 3 y 4 son copias de 1 (stdout
) y 2 (stderr
), respectivamente. Esto permite la salida dels
pasar normalmente astdout
ystderr
a través de 3 y 4 mientras que la salida detime
(que normalmente va astderr
) se redirige a la originalstdout
(1) y, a continuación capturada en la variable mediante la sustitución de comandos. Como puede ver en mi ejemplo, los nombres de los archivosbar
ybaz
se envían al terminal. ...-
.Time escribe su salida en STDERR en lugar de STDOUT. Para empeorar las cosas, por defecto 'time' es un comando integrado de shell, por lo que si intenta 'time ls 2> & 1', '2> & 1' solo se aplica a 'ls'.
La solución probablemente sería algo como:
Hay formas más elegantes de hacerlo, pero esa es la forma clara / simple.
fuente
La respuesta de @Dennis Williamson es excelente, pero no le ayuda a almacenar la salida del comando en una variable y la salida de
time
otra variable. En realidad, esto no es posible utilizando descriptores de archivo.Si desea registrar cuánto tiempo tarda un programa en ejecutarse, puede hacerlo simplemente restando la hora de inicio de la hora de finalización. Aquí hay un ejemplo simple que muestra cuántos milisegundos tardó un programa en ejecutarse:
Esto no es tan preciso como el
time
comando, pero debería funcionar perfectamente para la mayoría de los scripts de bash.Lamentablemente, el
date
comando de Mac no admite el%N
formato, pero puede instalarcoreutils
(brew install coreutils
) y usargdate
:fuente