【问题标题】:Processing output command with new lines redirected as Herestring [duplicate]使用重定向为 Herestring 的新行处理输出命令 [重复]
【发布时间】:2019-11-05 15:26:09
【问题描述】:

我正在处理一个处理 Herestring 输入的 while 循环:

one_is_achieved=0
while IFS="=" read key value ; do
  process_entry key value && one_is_achieved=1
done <<<$(output_entries)
# Dealing with one_is_achieved
[...]

函数output_entries() 输出键值行:

k1=some stuff
k2=other stuff
k3=remaining stuff

问题,命令替代 $() 捕获标准输出但用空格替换行尾,导致k1 条目为some stuff k2=other stuff k3= remaining stuff。

有没有办法防止替换或恢复行尾?


注意:我这样解决了我的问题:

while IFS="=" read key value ; do
  process_entry key value && one_is_achieved=1
done < <(output_entries)

但我认为原始问题仍然相关(保留或恢复行尾)。

【问题讨论】:

  • 我在您的帖子中没有看到 HERE 字符串。
  • @user1934428:&lt;&lt;&lt;。也许我用了错误的术语来命名它?
  • 啊,对不起,我的错误。我混淆了“这里的文档”和“这里的字符串”。当然你是对的 thsi 是一个这里的字符串。

标签: bash newline herestring


【解决方案1】:

这是如何在bash shell 中实现命令替换。未加引号的$(..) 会删除任何嵌入的换行符,因为shell 会进行默认的分词。默认的 IFS 值为 $' \t\n',未加引号的扩展会导致根据这 3 个字符中的任何一个进行拆分。

您需要引用替换以防止发生分词。从GNU bash man page 或在展开替换之前通过设置IFS="" 重置IFS 值。

$(command)

Bash 通过在子 shell 环境中执行 command 并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随的换行符。嵌入的换行符不会被删除,但可能会被删除during word splitting。

【讨论】:

  • 此行为取决于 Bash 版本:4.3 和更早的版本拆分未引用的此处字符串,4.4 和更新的版本不这样做。文档总是说没有分词。请参阅CHANGES,了解 4.4-alpha 和 4.4-beta 之间的变化(“Bash 不再拆分此处字符串的扩展,...”)。比较在 Bash 4.3 和 4.4 下运行 cat &lt;&lt;&lt; $(echo $'abc\ndef')。
  • 随时使用有用信息编辑答案。反正我已经把它做成了 Community Wiki
猜你喜欢
  • 2023-04-07
  • 2012-03-16
  • 2012-05-28
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多