Supongamos que tengo un binario llamado foo
.
Si quiero redirigir la salida de foo
algún otro proceso bar
, podría escribir ./foo | bar
.
Por otro lado, si quería time
foo, y redirigir la salida de los time
que podría escribir, time (./foo) | bar
.
Mi pregunta es, ¿cómo puedo pegar la salida time
al final de la salida foo
y 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 bar
es porque bar
puede ser un cliente de red y quiero que la información de tiempo se envíe al servidor como parte del mismo http POST
mensaje que la salida del proceso.
fuente
Respuestas:
Si entiendo lo que estás pidiendo, esto será suficiente. Estoy usando los comandos
ls ~
ytee
como sustitutos de./foo
ybar
, pero la forma general de lo que quieres es esta:NOTA: La salida de
time
ya 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>&1
para hacerlo.Ejemplo
Y aquí está el contenido del archivo
cmd.log
producido portee
.fuente
time
enví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
time
engañar, y redirigir la salida detime
podrí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) &> file
fuente