Foundations Updated 2026-09 View as Markdown

Process Substitution

In the previous section we’ve seen how to chain output of one command to the next one.

In the previous section we’ve seen how to chain output of one command to the next one. But what if you want to chain the output of two or more commands to the another one? What if you have a command that takes a file as argument but you would like to process whatever is send to that file?

Process substitution allows a process’s input or output to be referred to using a filename. It has two forms: output (cmd).

Example:#

Output#

Imagine you’ve two files for which you want to compare the content. Using diff file1 file2 could generate false positives in the case lines are not ordered. So if you want to compare those files you could create two new files, ordered, and compare those. It would look like:

shell
sort file1 > sorted_file1
sort file2 > sorted_file2
diff sorted_file1 sorted_file2

With process substitution you can do it in one line:

shell
diff <(sort file1) <(sort file2)

Input#

Imagine you want to store logs of an application into a file and at the same time print it on the console. A very handy command for that is tee.

shell
echo "Hello, world!" | tee /tmp/hello.txt

Now let say you want to have only lower case characters in the file but keep the regular case on the output. You could use process substitution that way:

shell
echo "Hello, world!" | tee >(tr '[:upper:]' '[:lower:]' > /tmp/hello.txt)

Get the Bash agent pack

A battle-tested AGENTS.md, the review checklist, and the failure-mode cheat sheet for Bash. One email, then occasional updates when the tooling shifts. No course pitch.

Unsubscribe in one click. We never sell the list. Or just take the AGENTS.md now — no email needed.