Quiero ejecutar el time
comando para medir el tiempo de varios comandos.
Lo que quiero hacer es:
- Mida el tiempo de ejecución de todos ellos sumados
- Escribir la
time
salida en un archivo - Escriba el
STDERR
del comando que estoy midiendoSTDERR
Lo que NO quiero hacer es
- Escriba los varios comandos en un script separado (¿por qué? Porque todo esto ya es un script que estoy generando programáticamente, y crear OTRO script temporal sería más complicado de lo que quiero)
Lo que probé hasta ahora:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
No funciona, time
se ejecuta solo en el primero.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
No funciona, (
es una ficha inesperada.
/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
No funciona, "no existe tal archivo o directorio".
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
No funciona, "no existe tal archivo o directorio".
time ( echo "a"; echo "b"; ) 2>outtime
No funciona, ya que redirige todo STDERR
a outtime
; Solo quiero la time
salida allí.
Y por supuesto,
time --output=outime echo "a";
No funciona desde entonces --output=outime: command not found
.
¿Cómo puedo hacerlo?
fuente
time -p sh -c 'echo "a"; echo "b"'
Prueba esto:
Explicación:
Primero, tenemos que encontrar una manera de redirigir la salida de
time
. Dado quetime
es un shell integrado, toma la línea de comando completa como el comando a medir, incluidas las redirecciones. Así,[Nota: el comentario de janos implica que este no es el caso
bash
.] Podemos lograr la redirección detime
la salida de 's ejecutandotime
en una subshell y luego redirigiendo la salida de esa subshell.Ahora hemos redirigido con éxito la salida de
time
, pero su salida se mezcla con la salida de error del comando que estamos midiendo. Para separar los dos, usamos un descriptor de archivo adicional.En el "exterior" tenemos
Esto significa: lo que esté escrito en el descriptor de archivo 3, se enviará al mismo lugar que el descriptor de archivo 2 (error estándar) está emitiendo ahora (el terminal). Y luego redirigimos el error estándar al archivo
timeout
.Así que ahora tenemos: todo lo escrito en stdout y fd 3 irá al terminal, y todo lo escrito en stderr irá al archivo. Lo que queda es redirigir el stderr del comando medido a fd 3.
Ahora, para que el tiempo mida más de un comando, debemos ejecutarlos en una (¡otra!) Subshell (dentro de paréntesis). Y para redirigir la salida de error de todos ellos a fd 3, necesitamos agruparlos dentro de llaves.
Entonces, finalmente, llegamos a:
Eso es.
fuente
No es la respuesta correcta pero está muy relacionada con la pregunta.
Obtener estadísticas de tiempo para múltiples programas se requieren paréntesis combinados. Comandos separados con punto y coma.
fuente
time ( command1 && command2 )
modo que si el primer comando falla; no procederá a ejecutar al otro.