Wondering what is the right use of here-string (here-document) and pipe.
For example,
a='a,b,c,d'
echo $a | IFS=',' read -ra x
IFS=',' read -ra x <<< $a
Both methods work. Then what would be the difference between the two functionality?
Another problem that I have about "read" is that:
IFS=',' read x1 x2 x3 x4 <<< $a
does not work, x1 is valued as "a b c d", and x2, x3, x4 has no value
but if:
IFS=',' read x1 x2 x3 x4 <<< "$a"
I can get x1=a, x2=b, x3=c, x4=d Everything is okay!
Can anyone explain this?
Thanks in advance
In the pipeline, two new processes are created: one for a shell to execute the echo
command, and one for a shell to execute the read
command. Since both subshells exit after they complete, the x
variable is not available after the pipeline completes. (In bash
4, the lastpipe
option was introduced to allow the last command in a pipeline to execute in the current shell, not a subshell, alleviating the problem with such pipelines).
In the second example, no extra process is need for the here string (a special type of here document that consists of a single line), so the value of x
is in fact set in the current shell, making it available for use later in the script/session.