obeattie
obeattie

Reputation: 3354

Redirecting bash stdout/stderr to two places?

This one's been bugging me for a while now. Is it possible to redirect stdout and stderr to both the terminal output and to a program?

I understand it's possible to redirect the outputs to a file and to stdout with tee, but I want it to go to a program (my editor [TextMate]) as well as to the terminal output… surely this is possible (I know its possible with zsh…)

Upvotes: 42

Views: 27804

Answers (3)

JasonSmith
JasonSmith

Reputation: 73752

You can use a named pipe, which is intended for exactly the situation you describe.

mkfifo some_pipe
command_that_writes_to_stdout | tee some_pipe \
  & command_that_reads_from_stdin < some_pipe
rm some_pipe

Or, in Bash:

command_that_writes_to_stdout | tee >(command_that_reads_from_stdin)

Upvotes: 34

CB Bailey
CB Bailey

Reputation: 793109

Is it possible to redirect stdout and stderr to both the terminal output and to a program?

I'm not sure how useful it is to combine stdout and stderr on the input to an editor, but does omething like this do what you need?

input_prog 2>&1 | tee /dev/tty | my_editor

Upvotes: 22

paxdiablo
paxdiablo

Reputation: 882616

I don't actually know whether TextMate can take a file to edit as its standard input, that seems a little bizarre. I suspect you would want to send the stdout/stderr to a file and edit it there, in which case you need:

progname 2>&1 | tee tempfile ; textmate tempfile

The 2>&1 redirects stderr (file handle 2) to go to the same place as stdout (file handle 1) so that both of them end up in a single stream. The tee command then writes that to tempfile as well as stdout.

Then, once the process has finished, the editor is called up on the temporary file.

If it can accept standard input for editing, use:

progname 2>&1 | tee /dev/tty | textmate

Upvotes: 2

Related Questions