¿Cómo puedo redirigir la salida `time` y la salida del comando a la misma tubería?


24

Supongamos que tengo un binario llamado foo.

Si quiero redirigir la salida de fooalgún otro proceso bar, podría escribir ./foo | bar.

Por otro lado, si quería timefoo, y redirigir la salida de los timeque podría escribir, time (./foo) | bar.

Mi pregunta es, ¿cómo puedo pegar la salida timeal final de la salida fooy canalizarla a través de la misma tubería ?

La siguiente solución no es lo que estoy buscando, porque inicia dos instancias separadas del proceso bar, mientras que quiero una única tubería compartida, a una sola instancia de bar.

time (./foo | bar)  | bar

Para cualquiera que tenga curiosidad, la razón por la que no desea iniciar dos instancias bares porque barpuede ser un cliente de red y quiero que la información de tiempo se envíe al servidor como parte del mismo http POSTmensaje que la salida del proceso.


respondió aquí, una respuesta algo mejor: stackoverflow.com/questions/13356628/…
JDS

Respuestas:


29

Si entiendo lo que estás pidiendo, esto será suficiente. Estoy usando los comandos ls ~y teecomo sustitutos de ./fooy bar, pero la forma general de lo que quieres es esta:

$ ( time ./foo ) |& bar

NOTA: La salida de timeya se está adjuntando al final de cualquier salida de ./foo, solo se está haciendo en STDERR. Para redirigirlo a través de la tubería, debe combinar STDERR con STDOUT. Puede usar cualquiera |&o 2>&1para hacerlo.

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

Ejemplo

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

Y aquí está el contenido del archivo cmd.logproducido por tee.

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

Tenga en cuenta que esta sintaxis no funciona para BASH.
jvriesem

1
@jvriesem todos los ejemplos son de bash
slm

9

timeenvía su salida a stderr en lugar de stdout por defecto. Solo necesita redirigir eso donde lo desee.

Usted dice "Por otro lado, si quisiera timeengañar, y redirigir la salida de timepodría escribir time (./foo) | bar". Pero esto es realmente incorrecto. En este caso, la salida de tiempo aún se mostraría en su consola, solo se redireccionaría stdout.

Puede redirigir stderr específicamente con:

(time foo) 2>&1 | bar

o todas las tuberías con:

(time foo) |& bar

Los corchetes son necesarios para que esto funcione correctamente.


0

Descubrí que esto funciona en Solaris. (time ls) &> file


1
Esto no es diferente a ninguna de las soluciones existentes
roaima
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.