2010-03-09 15 views
64

I tratado de redirigir la salida del comando de tiempo, pero no pude:¿Cómo puedo redirigir la salida del comando "tiempo"?

$time ls > filename 
real 0m0.000s 
user 0m0.000s 
sys  0m0.000s 

En el archivo puedo ver la salida del comando ls, no la de time. Explique, por qué no pude y cómo hacer esto.

+1

debe estar en superusuario, creo. – Mnementh

+1

¡No lo creo! – abubacker

+1

La respuesta a esta pregunta no solo es de interés para los programadores, sino también para otros usuarios avanzados: http://superuser.com/ – Mnementh

Respuesta

75

puede redirigir la salida de tiempo utilizando,

(time ls) &> file 

Debido a que usted necesita tomar (ls tiempo) como un solo comando para que pueda utilizar llaves.

+0

sí, estoy realmente bien, pero la pregunta es ¿cómo lo hicieron? – abubacker

+1

comando de tiempo tomará los argumentos como un comando. Pero el paréntesis agrupará eso como un solo comando. Ex: ls tiempo> file1.txt En argumentos, 0 = tiempo 1 = "ls> file1.txt" – sganesh

+5

Y comando imprime la salida de tiempo en stderr. Para que pueda usar (tiempo ls) 2> archivo – sganesh

8

El tiempo es shell incorporado y no estoy seguro de si hay alguna forma de redirigirlo. Sin embargo, puede usar /usr/bin/time, que definitivamente acepta cualquier redirección de salida.

+0

/usr/bin/time --nombre de archivo de salida ls – chub

+3

El tiempo de compilación funciona bien con la redirección de salida. Solo se genera en STDERR, no en STDOUT. – Mnementh

+0

El problema es que los comandos integrados se ejecutan dentro del propio entorno de shell, no como una subcadena. Como el stderr de tu shell normalmente está conectado a la terminal, la redirección no hará nada. Para redirigir el tiempo incorporado, creo que tendrías que hacer algo como 'bash time mycmd 2> file'. O simplemente llame a '/ usr/bin/time' como se mencionó. – ktbiz

16

La hora de comando envía su salida a STDERR (en lugar de STDOUT). Esto se debe a que el comando ejecutado con tiempo normalmente (en este caso ls) da salida a STDOUT.

Si desea capturar la salida de tiempo, a continuación, escriba:

(time ls) 2> filename 

que capta sólo la salida de tiempo, pero la salida de ls va normal a la consola. Si desea capturar ambos en un solo archivo, escriba:

(time ls) &> filename 

2> redirecciones STDERR, &> redirige ambos.

+1

Esta respuesta en realidad responde * por qué * el redireccionamiento del OP no funcionaba, que era una de las preguntas que el OP estaba haciendo. Nadie más aborda esto. – Joshua

101

sin necesidad de iniciar sub shell. Usar un bloque de código también lo hará.

{ time ls; } 2> out.txt 

o

{ time ls > /dev/null 2>&1 ; } 2> out.txt 
+0

+1, la mejor respuesta –

+0

de acuerdo, la mejor respuesta. Te da la opción de eliminar los resultados de ls y solo obtener el tiempo. Gracias ghostdog74 – rd42

+0

Esto funcionó con AIX cuando nada podía redirigir la salida del comando "hostent". ¡Gracias! – Hugo

3

Si no quiere mezclar la salida de time y el comando. Con el tiempo GNU, se puede utilizar como -o file:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err 

mientras tim es la salida de tiempo, y outerr son stdout y stderr de grep.

0

La razón por la cual la redirección no parece funcionar con time es que es una palabra reservada bash (¡no es un builtin!) Cuando se usa en frente de una tubería. bash (1):

Si la palabra reservada tiempo precede una tubería, la , así como el tiempo transcurrido usuario y el sistema consumida por su ejecución se presentan cuando los termina de tuberías.

Así, para redirigir la salida de time, o bien utilizar llaves:

{ time ls; } 2> filename 

O llame /usr/bin/time:

/usr/bin/time ls 2> filename 
Cuestiones relacionadas