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

Respuestas:
Si entiendo lo que estás pidiendo, esto será suficiente. Estoy usando los comandos
ls ~yteecomo sustitutos de./fooybar, pero la forma general de lo que quieres es esta: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|&o2>&1para hacerlo.Ejemplo
Y aquí está el contenido del archivo
cmd.logproducido portee.fuente
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 detimepodría escribirtime (./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:
o todas las tuberías con:
Los corchetes son necesarios para que esto funcione correctamente.
fuente
Descubrí que esto funciona en Solaris.
(time ls) &> filefuente