I recently discovered the 'moreutils' package in Debian (and Ubuntu). It's a collection of convenient unix tools.

One of the commands is 'pee'. The man page says:

pee is like tee but for pipes.

However it's a short man page, I have filed a bug about it. Does anyone know what it does, how to use it, why one would use it?

2 Answers 2


Here's what you can do with pee:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

So pee works with shell pipes instead of files.

bash doesn't need pee, it can open shell commands as files:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)
  • 1
    Would this work with filename jockers ? See zgp.org/~dmarti/tips/git-multiple-post-receive-hooks - pee is used to multiply stdin and give clones to every script mathing the filename pattern, can pure bash do this ? AFAIU it would expand asterisk inside the brackets causnig something like tee >(app1 app2 app3 app4) which is not >(app1) >(app2) >(app3) >(app4) that your answer shows Nov 4, 2012 at 13:59
  • @Arioch, the bash syntax won't work with the hooks-joker technique. Just install moreutils.
    – Tobu
    Nov 4, 2012 at 23:40
  • 1
    Use tee >/dev/null to avoid replicating stdin to stdout
    – jfs
    Jan 6, 2014 at 11:59
  • 1
    the real advantage to pee over tee is that it sends the stdout from each sub process to the stdout of pee itself. with tee you need to redirect each processes stdout to a file if you want to save it, but with pee you just need to save the stdout. of course that only makes sense if each sub command is outputting a similarly formatted thing. like if you couldn't figure out how to or regular expressions in grep you could do cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt ... using tee you would just get a copy of file on stdout.
    – underrun
    Jul 22, 2014 at 22:13
  • The >(command) feature is called Process substitution. Jul 22, 2019 at 21:11

It's probably easier to understand if you've used tee first. This useful old tool takes standard input and writes out to multiple files, plus standard output. The following:

echo "Hello world" | tee one two

Will create two files, named one and two, both containing the string Hello world. It will also print to your terminal.

Now pee performs a similar function but instead of redirecting output to multiple files it redirects to multiple secondary commands, ala pipes. It differs slightly from tee in the respect that it doesn't send the original stdin to stdout because it wouldn't make sense combining it with the output of the secondary commands. The following very simple example:

echo "Hello world" | pee cat cat

Will output the string Hello world to your terminal twice. This is because each of the two instances of cat receives the standard output and does what cat does, which is print.

  • 3
    I'm trying to read that last example with a straight face and failing miserably Apr 3, 2020 at 1:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.