首页 > 解决方案 > 使用重定向为 Herestring 的新行处理输出命令

问题描述

我正在处理一个处理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

问题,命令 subtitution $()捕获 stdout 但用空格替换行尾,导致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)

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

标签: bashnewlineherestring

解决方案


这就是bashshell中实现命令替换的方式。由于$(..)shell 进行了默认的分词,未加引号的形式会删除任何嵌入的换行符。默认的 IFS 值是$' \t\n',不带引号的扩展会导致基于这 3 个字符中的任何一个进行拆分。

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

$(command)

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


推荐阅读