bash 3 和 bash 5 以不同方式评估此处字符串空白

bash 3 and bash 5 evaluate herestring whitespace differently

我有一个脚本:

#!/bin/bash

{ read a
read b
} <<< $(echo a; echo b)

declare -p a b

我把它写给 fchmod +x ./f 写了,并期望 bash ./f./f 是相同的。

他们不是:

~/dev/test[1]$ ./f
declare -- a="a b"
declare -- b=""
~/dev/test[2]$ bash ./f
declare -- a="a"
declare -- b="b"

我发现 bash ./f 使用的是 /usr/local/bin/bash 版本 5.0.16,而 ./f 使用 /bin/bash 的版本是 3.2.57。

这些版本之间有什么变化使这个评估不同?这是一个已解决的错误吗?

Before bash 4.4, herestrings were not treated as implicitly quoted. 因此,用于生成 here-string 的参数扩展或命令替换的结果可能是 string-split(然后 re-joined 带有空格,无论哪个来自 IFS 的字符最初用于拆分)。

此错误已在 bash 4.4 中修复。

要解决此错误,请始终明确引用您的扩展,即使它们用于填充 heredoc:<<<"$(echo a; echo b)"