"here string"和echo + pipe之间有什么区别?

dra*_*ang 8 bash pipe heredoc

想知道here-string(here-document)和pipe的正确用法是什么.

例如,

a='a,b,c,d'
echo $a | IFS=',' read -ra x
IFS=',' read -ra x <<< $a
Run Code Online (Sandbox Code Playgroud)

两种方法都有效.那么这两个功能有什么区别?

我对"阅读"的另一个问题是:

IFS=',' read x1 x2 x3 x4 <<< $a
Run Code Online (Sandbox Code Playgroud)

不起作用,x1的值为"abc d",而x2,x3,x4没有值

但如果:

IFS=',' read x1 x2 x3 x4 <<< "$a"
Run Code Online (Sandbox Code Playgroud)

我可以得到x1 = a,x2 = b,x3 = c,x4 = d一切都好!

有谁能解释一下?

提前致谢

che*_*ner 10

在管道中,创建了两个新进程:一个用于执行echo命令的shell,另一个用于执行read命令的shell .由于两个子shell在完成后都会退出,因此x在管道完成后变量不可用.(在bash4中,lastpipe引入了选项以允许管道中的最后一个命令在当前shell中执行,而不是子shell,从而缓解此类管道的问题).

在第二个示例中,here字符串(此处文档的特殊类型由单行组成)不需要额外的进程,因此x实际上在当前shell中设置了值,使其可供以后在脚本/会话.

  • `x` 必须有一个先前的值,因为管道不会在当前 shell 中设置 `x` 的值。这里创建文档的部分原因是为了避免使用管道引入的子外壳问题。 (2认同)