使用 'read' 的多变量赋值在 bash v4.3.48 中有效,在 v4.4.7 中无效

Multiple variable assignment using 'read' works in bash v4.3.48 and does not in v4.4.7

我正在使用两个发行版,它们使用 bash v4.3.48 和 v4.4.7。

read VAR1 VAR2 <<< $(echo 0 ; echo 1)
echo $VAR2

对于bash v4.3.48,上述命令的结果是$VAR2 的值为1。 但是,对于 bash 4.4.7,$VAR2 为空。

为了得到相同的结果,在 4.4.7 中,我必须修改脚本:

read VAR1 VAR2 <<< $(echo -n $(echo 0 ; echo 1) )

我不知道我的(以前的)脚本是错误的,还是较新的 bash。

扩展 <<< $( ) 时的行为似乎略有变化。通常,当 $( ) 出现时没有双引号,结果会进行分词和通配符扩展。但是当它在 <<< 之后时,bash 的早期版本似乎跳过了通配符扩展部分,而是对其进行分词,然后将结果与空格一起粘贴回去。您可以使用 cat 而不是 read:

来查看
$ echo $BASH_VERSION
4.2.10(1)-release
$ cat <<< $(echo 0; echo 1)
0 1
$ cat <<< $(echo '*       *'; echo 1)
* * 1

请注意,'* *' 中的多余空格已消失,并且两个 echoed 字符串之间的换行符已变成空格,但通配符并未扩展为文件列表.结果,当您使用 read VAR1 VAR2 <<< $(echo 0 ; echo 1) 时,read 收到“0 1”并将这些数字放入两个变量中。

另一方面,bash 的较新版本也跳过了单词拆分:

$ echo $BASH_VERSION
4.4.12(1)-release
$ cat <<< $(echo 0; echo 1)
0
1
$ cat <<< $(echo '*       *'; echo 1)
*       *
1

这意味着当你使用read VAR1 VAR2 <<< $(echo 0 ; echo 1)时,read命令接收到两行:“0”和“1”,但它只读取一行 ("0"),因此只有 $VAR1 得到一个值。

更新: spotted the change in the release notes for bash-4.4-beta

z. Bash no longer splits the expansion of here-strings, as the documentation has always said.