Duel of the ages!

1. Bash

Probably also applicable to zsh.

1.1. Process substitution

When you write “<(…)” or “>(…)”, think of it as executing whatever's inside and replacing them with paths to files representing the stdout and stdin of the executed process, respectively:

$ ls <(foo)  # Becomes ls /proc/53722/fd/11
/proc/53722/fd/11

Allows the construction of non-linear pipelines. Also useful when a program expects a file instead of working with stdin/stdout. Some practical (?) examples:

diff <(ls /dev) <(sleep 3; ls /dev)
example > >(less) 2> >(tee errors.txt)
tar cf - directory | tee >(ssh giraffe tar xf -) >(ssh 192.168.1.7 tar xf -) > /dev/null

2. Rc

2.1. Process substitution

See Process substitution of Bash, but with braces instead of parentheses.