我有一个脚本:
#!/bin/bash
{ read a
read b
} <<< $(echo a; echo b)
declare -p a b
Run Code Online (Sandbox Code Playgroud)
我把它写到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"
Run Code Online (Sandbox Code Playgroud)
我想通了,bash ./f使用/usr/local/bin/bash它是5.0.16版本,并且./f使用/bin/bash的3.2.57版本。
这些版本之间发生了什么变化以使其评估不同?这是一个已经解决的错误吗?
在 bash 4.4 之前,这里的字符串不被视为隐式引用。因此,用于生成 here-string 的参数扩展或命令替换的结果可以是字符串拆分(然后用空格重新连接,无论最初在拆分中使用 IFS 中的哪个字符)。
此错误已在 bash 4.4 中修复。
要解决此错误,请始终明确引用您的扩展,即使它们用于填充 heredoc: <<<"$(echo a; echo b)"