Suppose I have a binary called foo
.
If I want to redirect the output of foo
to some other process bar
, I could write ./foo | bar
.
On the other hand, if I wanted to time
foo, and redirect the output of time
I could write, time (./foo) | bar
.
My question is, how can I stick the output of time
to the end of the output of foo
and pipe it through the same pipe?
The following solution is not what I am looking for, because it starts two separate instances of the process bar
, while I want a single shared pipe, to a single instance of bar
.
time (./foo | bar) | bar
For anyone who is curious, the reason for not wanting to start two instances of bar
is because bar
can be a network client and I want the timing information to be sent to the server as part of the same http POST
message as the process output.
Best Answer
If I understand what you're asking for I this will do. I'm using the commands
ls ~
andtee
as stand-ins for./foo
andbar
, but the general form of what you want is this:NOTE: The output of
time
is already being attached at the end of any output from./foo
, it's just being done so on STDERR. To redirect it through the pipe you need to combine STDERR with STDOUT. You can use either|&
or2>&1
to do so.Example
And here's the contents of the file
cmd.log
produced bytee
.