0

我有一个脚本:

#!/bin/bash

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

declare -p a b

我把它写给f, 做chmod +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 版。

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

4

1 回答 1

5

在 bash 4.4 之前,herestrings 不被视为隐式引用。因此,用于生成 here-string 的参数扩展或命令替换的结果可以是字符串拆分(然后用空格重新连接,无论 IFS 中的哪个字符最初用于拆分)。

此错误已在 bash 4.4 中修复。

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

于 2020-08-26T21:13:03.873 回答