【问题标题】:What's the difference between "here string" and echo + pipe“here string”和echo + pipe有什么区别
【发布时间】:2013-08-09 14:15:57
【问题描述】:

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

例如,

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 一切正常!

谁能解释一下?

提前致谢

【问题讨论】:

  • 你的第二个问题很有趣,但应该单独问。将两个不相关的问题放在同一个帖子中会使其他有相同问题的人以后更难找到该问题。
  • 我想知道是否值得将其标记为 stackoverflow.com/questions/41899075/… 的骗子——这个问题的题外话较少,因此可能对那些严格感兴趣的人更有用标题中给出的 pipeline-vs-herestring 问题。

标签: bash pipe heredoc


【解决方案1】:

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

在第二个例子中,here字符串(一种特殊类型的here文档,由一行组成)不需要额外的处理,所以x的值实际上是在当前shell中设置的,使得可供稍后在脚本/会话中使用。

【讨论】:

  • thx,但我不太了解管道导致变量不可用:我尝试使用 GNU bash 版本 3.2.48(1),管道结束后仍然可以回显 $x。这两种方法的不同目的是什么? (功能,用法)
  • x 必须有以前的值,因为管道不会在当前 shell 中设置 x 的值。这里创建文档,部分是为了避免使用管道引入的子shell问题。
  • 我明白了,谢谢!!请帮助我解决问题的附加部分。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-12-20
  • 2015-07-22
  • 1970-01-01
  • 2020-04-25
  • 2016-11-09
  • 2016-03-26
  • 1970-01-01
  • 2022-12-13
相关资源
最近更新 更多