A command substitution (`$(...)`) will be replaced by *the output* of the command, while a process substitution (`<(...)`) will be replaced by *a filename* from which the output of the command may be read. The command, in both instances, will be run in a subshell. In your case, the output from `pwd` in `<(pwd)` may be found at `/dev/fd/63`. This file ceases to exist as soon as the command that _uses_ the process substitution has finished executing (when the assignment to `var` in your example is done). The filename returned by a process substitution is the name of a file descriptor or named pipe, not a regular file: >Process substitution is supported on systems that support named pipes (FIFOs) or the `/dev/fd` method of naming open files. A common use of process substitution is to pre-sort files for the `join` command: $ join <( sort file1 ) <( sort file2 ) or for removing columns from a file (here, column 2 is removed from a tab-delimited file by using `cut` twice and `paste` to stitch the result together): $ paste <( cut -f 1 file ) <( cut -f 3- file ) Process substitution is more or less a syntactical shortcut for avoiding using temporary files explicitly. --- Both command substitutions and process substitutions are performed in subshells. The following shows that the environment in these subshells do not affect the parent shell's environment: $ unset t $ echo "$( t=1234; echo "$t" )" 1234 $ echo "$t" (empty line output) Here, `echo` gets `1234` as a string argument from the command substitution. $ unset t $ cat <( t=4321; echo "$t" ) 4321 $ echo "$t" (empty line output) Here, `cat` get the filename of a file (named pipe/file descriptor) as its argument. The file contains the data `4321`.