使用重定向为 Heresstring 的新行处理输出命令

Processing output command with new lines redirected as Herestring

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

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)

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

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

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

$(command)

Bash performs the expansion by executing command in a subshell environment and replacing the command substitution with the standard output of the command, with any trailing newlines deleted. Embedded newlines are not deleted, but they may be removed during word splitting.