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 < <(cmd_src) will continously feed the output of
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