bashshellprocesspipesubshell

How to pipe multiple commands into a single command in the shell? (sh, bash, ...)


How can I pipe the stdout of multiple commands to a single command?

Example 1: combine and sort the output of all three echo commands:

echo zzz; echo aaa; echo kkk

desired output:

aaa
kkk
zzz

Example 2: rewrite the following so that all the commands are in a single command-line using pipes, without redirects to a temp file:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo

Solution

  • Use parentheses ()'s to combine the commands into a single process, which will concatenate the stdout of each of them.

    Example 1 (note that $ is the shell prompt):

    $ (echo zzz; echo aaa; echo kkk) | sort
    aaa
    kkk
    zzz
    

    Example 2:
    $ (setopt; unsetopt; set) | sort