¿Cómo puedo redirigir la salida del comando "tiempo"?

95

Intenté redirigir la salida del comando de tiempo, pero no pude:

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

En el archivo puedo ver la salida del lscomando, no la de time. Por favor, explique por qué no pude y cómo hacer esto.

abubacker
fuente
1
Debería estar en Superusuario, creo.
Mnementh
1
La respuesta a esta pregunta no sólo es de interés para los programadores, sino también para otros usuarios avanzados: superuser.com
Mnementh
1
Posible duplicado de ¿Hay alguna manera de redirigir la salida de tiempo al archivo en Linux?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

104

puede redirigir la salida de tiempo usando,

(time ls) &> file

Porque necesita tomar (time ls) como un solo comando para poder usar llaves.

sganesh
fuente
1
sí, realmente bien, pero la pregunta es ¿cómo hicieron esto?
abubacker
2
El comando time tomará los argumentos como un comando. Pero el paréntesis lo agrupará como un comando. Ejemplo: tiempo ls> file1.txt En argumentos, 0 = tiempo 1 = "ls> file1.txt"
sganesh
8
Y el comando de tiempo imprime la salida en stderr. Entonces puede usar (time ls) 2> file
sganesh
5
Aclaración sobre el &>favor, ¿dónde puedo obtener información sobre estos?
hello_there_andy
3
@hello_there_andy &>filees análogo a >file 2>&1. Dirige stdout y stderr.
ktbiz
129

no es necesario iniciar sub shell. Usar un bloque de código también servirá.

{ time ls; } 2> out.txt

o

{ time ls > /dev/null 2>&1 ; } 2> out.txt
ghostdog74
fuente
1
De acuerdo, mejor respuesta. Le da la opción de deshacerse de los resultados de ls y obtener el tiempo. Gracias ghostdog74
rd42
1
Esto funcionó con AIX cuando nada podía redirigir la salida del comando "hostent". ¡Gracias!
Hugo
1
Aclaración sobre el 2>favor. ¿Dónde puedo aprender sobre estos?
hello_there_andy
3
¿Cómo lo hago si quiero ambos> y 2> al mismo tiempo?
Jorge Fernández
25

El tiempo de comando envía su salida a STDERR (en lugar de STDOUT). Eso es porque el comando ejecutado con el tiempo normalmente (en este caso ls) se envía a STDOUT.

Si desea capturar la salida del tiempo, escriba:

(time ls) 2> filename

Eso captura solo la salida de tiempo, pero la salida de ls es normal en la consola. Si desea capturar ambos en un archivo, escriba:

(time ls) &> filename

2> redirecciona STDERR, &> redirecciona ambos.

Mnementh
fuente
1
Esta respuesta en realidad responde por qué la redirección del OP no funcionaba, que era una de las preguntas que hacía el OP. Nadie más aborda esto.
NeutronStar
¿Cómo sería un proceso de tubería a otro con esto?
Paul
10

el tiempo está integrado en el shell y no estoy seguro de si hay forma de redirigirlo. Sin embargo, puede usar /usr/bin/timeen su lugar, que definitivamente acepta cualquier redirección de salida.

Michal Čihař
fuente
/ usr / bin / time --output filename ls
chub
4
El tiempo incorporado funciona bien con la redirección de salida. Solo emite en STDERR, no en STDOUT.
Mnementh
El problema es que los comandos integrados se ejecutan dentro del propio entorno de shell, no en un subshell. Dado que el stderr de su shell generalmente está conectado al 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 /usr/bin/timecomo se mencionó.
ktbiz
También puede utilizar el no integrado sin especificar la ruta completa: stackoverflow.com/questions/29540540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4

Si no desea mezclar la salida de timey el comando. Con el tiempo de GNU, puede usar -o filecomo:

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

while times una salida de tiempo outy errson stdout y stderr de grep.

Ding-Yi Chen
fuente
4

La razón por la que la redirección no parece funcionar timees que es una palabra reservada de bash (¡no incorporada!) Cuando se usa frente a una canalización. bash (1):

Si la palabra de tiempo reservado precede a una canalización, el tiempo transcurrido, así como el tiempo del usuario y del sistema consumido por su ejecución se informa cuando termina la canalización.

Entonces, para redirigir la salida de time, use llaves:

{ time ls; } 2> filename

O llame al /usr/bin/time:

/usr/bin/time ls 2> filename
usuario1338062
fuente
0

Utilizo la redirección del método stdout y stderr con llaves para las pruebas.
El &>>rptrepresenta esto >>rpt 2>&1pero más corto.
Las llaves ejecutarán un comando (s) en el shell actual. Ver: man bash

{ time ls a*; } &>>rpt
cognativeorc
fuente