Frage

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

War es hilfreich?

Lösung

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top