¿Cómo redirigir la salida del comando de tiempo a un archivo en Linux?

Solo una pequeña pregunta sobre los progtwigs de tiempo en Linux: el comando de tiempo permite medir el tiempo de ejecución de un progtwig:

[ed@lbox200 ~]$ time sleep 1 real 0m1.004s user 0m0.000s sys 0m0.004s 

Lo cual funciona bien. Pero si bash redirigir la salida a un archivo, falla.

 [ed@lbox200 ~]$ time sleep 1 > time.txt real 0m1.004s user 0m0.001s sys 0m0.004s [ed@lbox200 ~]$ cat time.txt [ed@lbox200 ~]$ 

Sé que hay otras implementaciones de tiempo con la opción -o para escribir un archivo, pero mi pregunta es sobre el comando sin esas opciones.

Alguna sugerencia ?

Tratar

 { time sleep 1 ; } 2> time.txt 

que combina el STDERR de “tiempo” y tu comando en time.txt

O usar

 { time sleep 1 2> sleep.stderr ; } 2> time.txt 

que pone STDERR de “dormir” en el archivo “sleep.stderr” y solo STDERR de “tiempo” entra en “time.txt”

Ajustar el time y el comando que está cronometrando en un conjunto de corchetes.

Por ejemplo, los siguientes tiempos ls y escribe el resultado de ls y los resultados del tiempo en outfile :

 $ (time ls) > outfile 2>&1 

O bien, si desea separar la salida del comando de la salida capturada desde el time :

 $ (time ls) > ls_results 2> time_results 

Sencillo. La utilidad de time GNU tiene una opción para eso.

Pero debes asegurarte de que no estás usando el comando de time incorporado de tu caparazón, ¡al menos el bash incorporado no proporciona esa opción! Es por eso que necesita dar la ruta completa de la herramienta de time :

 /usr/bin/time -o time.txt sleep 1 

Si le importa la salida de error del comando, puede separarlos así mientras sigue usando el comando de tiempo incorporado.

 { time your_command 2> command.err ; } 2> time.log 

o

 { time your_command 2>1 ; } 2> time.log 

Como puede ver, los errores del comando van a un archivo (ya que stderr se usa por time ).

Desafortunadamente no puedes enviarlo a otro controlador (como 3>&2 ) ya que eso ya no existirá fuera del {...}

Dicho eso, si puedes usar el tiempo de GNU, simplemente haz lo que dijo @Tim Ludwinski.

 \time -o time.log command 

Si usa tiempo de GNU en lugar de bash incorporado, pruebe

 time -o outfile command 

(Nota: los formatos de tiempo GNU son un poco diferentes a los bash incorporados).

Dado que el resultado del comando ‘time’ es la salida de error, redirigirlo como salida estándar sería más intuitivo para hacer más procesamiento.

 { time sleep 1; } 2>&1 | cat > time.txt 
 &>out time command >/dev/null 

en tu caso

 &>out time sleep 1 >/dev/null 

entonces

 cat out 
 #!/bin/bash set -e _onexit() { [[ $TMPD ]] && rm -rf "$TMPD" } TMPD="$(mktemp -d)" trap _onexit EXIT _time_2() { "$@" 2>&3 } _time_1() { time _time_2 "$@" } _time() { declare time_label="$1" shift exec 3>&2 _time_1 "$@" 2>"$TMPD/timing.$time_label" echo "time[$time_label]" cat "$TMPD/timing.$time_label" } _time a _do_something _time b _do_another_thing _time c _finish_up 

Esto tiene el beneficio de no descascarar caparazones secundarios, y la tubería final tiene su estructura restaurada en la línea real.

Terminé usando:

 /usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol 
  • Donde se agrega “a”
  • Donde “o” es procesada por el nombre del archivo para agregar a
  • Donde “f” es formato con una syntax similar a printf
  • Donde “% E” produce 0:00:00; horas: minutos: segundos
  • Tuve que invocar / usr / bin / time porque el “tiempo” bash lo estaba pisoteando y no tiene las mismas opciones
  • Solo estaba tratando de obtener salida al archivo, no es lo mismo que OP

Si no desea tocar el proceso original ‘stdout and stderr, puede redireccionar stderr al descriptor de archivo 3 y regresar:

 $ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out foo bar at -e line 1. $ cat time.out real 0m0.009s user 0m0.004s sys 0m0.000s 

Puede usarlo para un contenedor (por ejemplo, para cronjobs) para monitorear tiempos de ejecución:

 #!/bin/bash echo "[$(date)]" "$@" >> /my/runtime.log { time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log 

Si está utilizando csh puede usar:

 /usr/bin/time --output=outfile -p $SHELL -c 'your command' 

Por ejemplo:

 /usr/bin/time --output=outtime.txt -p csh -c 'cat file'