In bash, when a string is enclosed by double quotes, it is interpreted as a literal, EXCEPT when at least one of the following special characters are involved:
$ ` \ ! * @
The syntax for process substitution <(command_list)
can't be interpreted inside double quotes. There is no character involved that will be interpreted as anything other than a literal. Double quoting MUST prevent process substitution, because it doesn't allow its syntax to be interpreted.
The syntax for command substitution is:
$(command)
# or
`command`
Both of these start with characters that are special characters within double quotes ($
, or back-tics), and, as you know, double quoting does not suppress command substitution.
This is generally a good first rule to consider when you want to predict whether double quoting will suppress some behavior. If the syntax doesn't involve one of those 6 characters, double quoting HAS to suppress it (brace expansion, tilde expansion, process substitution, word splitting on , none of these can occur inside double quoting). Of course, not everything with a syntax that involves one of those six characters occurs within double quotes, but it's a good first rule to consider. This answer and rule is meant to help you make predictions before you've encountered and memorized all the cases. If a syntax can't be interpreted inside double quotes, the behavior can't occur.
$(…)
,<(…)
,>(…)
?IFS
the/
:bash -c 'IFS=/; x=/dev/fd/1; printf "{%s}\n" <(sleep 10) $x'
; only the$x
will be split.