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

时间:2013-08-08 01:07:41

标签: bash pipe heredoc

想知道here-string(here-document)和pipe的正确用法。

例如,

a='a,b,c,d'
echo $a | IFS=',' read -ra x
IFS=',' read -ra x <<< $a

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

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

IFS=',' read x1 x2 x3 x4 <<< $a

不起作用,x1的值为“a b c d”,而x2,x3,x4没有值

但是如果:

IFS=',' read x1 x2 x3 x4 <<< "$a"

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

任何人都能解释一下吗?

提前致谢

1 个答案:

答案 0 :(得分:9)

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

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