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
A here string can be considered as a stripped-down form of a here document. It consists of nothing more than COMMAND <<< $WORD, where $WORD is expanded and fed to the stdin of COMMAND. As a simple example, consider this alternative to the echo-grep construction.
Here document (Heredoc) is an input or file stream literal that is treated as a special block of code. This block of code will be passed to a command for processing. Heredoc originates in UNIX shells and can be found in popular Linux shells like sh, tcsh, ksh, bash, zsh, csh.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With