Bash Process substitution To avoid usage of a sub-shell


Example

One major aspect of process substitution is that it lets us avoid usage of a sub-shell when piping commands from the shell.

This can be demonstrated with a simple example below. I have the following files in my current folder:

$ find . -maxdepth 1 -type f -print
foo bar zoo foobar foozoo barzoo 

If I pipe to a while/read loop that increments a counter as follows:

count=0
find . -maxdepth 1 -type f -print | while IFS= read -r _; do
    ((count++))
done

$count now does not contain 6, because it was modified in the sub-shell context. Any of the commands shown below are run in a sub-shell context and the scope of the variables used within are lost after the sub-shell terminates.

command &
command | command 
( command )

Process substitution will solve the problem by avoiding use the of pipe | operator as in

count=0
while IFS= read -r _; do
    ((count++))
done < <(find . -maxdepth 1 -type f -print)

This will retain the count variable value as no sub-shells are invoked.