The cmd | read -r var1 var2
construct famously does not work in bash because the read command is executed in a subshell due to piping. I used to use read -r var1 var2 <<< "$(cmd)"
to get around this, but recently I learned about the cmd_drain < <(cmd_src)
construct, which seems to work just as well: read -r var1 var2 < <$(cmd)
.
Is there a difference between these two solutions? There does not seem to be any difference in the trivial case:
$ hd < <(echo Hello)
00000000 48 65 6c 6c 6f 0a |Hello.|
00000006
$ hd <<< $(echo Hello)
00000000 48 65 6c 6c 6f 0a |Hello.|
00000006
I also tried some special characters and got the same results. My gut feeling is that the result will always be the same expect that cmd_drain <<< "$(cmd_src)"
will first run cmd_src
and buffer the whole result in memory before feeding it to cmd_drain
, while cmd_drain < <(cmd_src)
will continously feed the output of cmd_src
into cmd_drain
. I assume it behaves like cmd_src | cmd_drain
except that cmd_src
will be run in a sub-shell instead of cmd_drain
. Is my assumption correct?
Bonus question: Is quoting necessary around the $()
construct?