tuberias script salida redireccionamiento por pipes mensajes los log guardar generados filtros error envían ejemplos dónde defecto comandos comando archivo linux bash time

script - tuberias y filtros en linux



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

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

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

Lo cual funciona bien. Pero si intento 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 ?


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


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


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 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''


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 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 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).


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 sintaxis 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

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"


#!/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.


&>out time command >/dev/null

en tu caso

&>out time sleep 1 >/dev/null

entonces

cat out