There are some commands which filter or act on input, and then pass it along as output, I think usually to stdout
– but some commands will just take the stdin
and do whatever they do with it, and output nothing.
I'm most familiar with OS X and so there are two that come to mind immediately are pbcopy
and pbpaste
– which are means of accessing the system clipboard.
Anyhow, I know that if I want to take stdout and spit the output to go to both stdout
and a file then I can use the tee
command. And I know a little about xargs
, but I don't think that's what I'm looking for.
I want to know how I can split stdout
to go between two (or more) commands. For example:
cat file.txt | stdout-split -c1 pbcopy -c2 grep -i errors
There is probably a better example than that one, but I really am interested in knowing how I can send stdout to a command that does not relay it and while keeping stdout
from being "muted" – I'm not asking about how to cat
a file and grep
part of it and copy it to the clipboard – the specific commands are not that important.
Also – I'm not asking how to send this to a file and stdout
– this may be a "duplicate" question (sorry) but I did some looking and could only find similar ones that were asking about how to split between stdout and a file – and the answers to those questions seemed to be tee
, which I don't think will work for me.
Finally, you may ask "why not just make pbcopy the last thing in the pipe chain?" and my response is 1) what if I want to use it and still see the output in the console? 2) what if I want to use two commands which do not output stdout
after they process the input?
Oh, and one more thing – I realize I could use tee
and a named pipe (mkfifo
) but I was hoping for a way this could be done inline, concisely, without a prior setup 🙂
Best Answer
You can use
tee
and process substitution for this:This will send all the output of
cat file.txt
topbcopy
, and you'll only get the result ofgrep
on your console.You can put multiple processes in the
tee
part: