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
我把它写给 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。
这些版本之间有什么变化使这个评估不同?这是一个已解决的错误吗?
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)"
我有一个脚本:
#!/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。
这些版本之间有什么变化使这个评估不同?这是一个已解决的错误吗?
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)"