0

运行这些命令会产生预期的结果

$ bash --version
GNU bash, version 4.1.11(2)-release

$ foo=(111 222 333)

$ IFS=, cat <<< "${foo[*]}"
111,222,333

然而,在 Bash 4.2 中,IFS 值被忽略了

$ bash --version
GNU bash, version 4.2.0(1)-release

$ foo=(111 222 333)

$ IFS=, cat <<< "${foo[*]}"
111 222 333

是什么导致了这种差异?

我在这里找到了答案

http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00065.html

看起来这一直是一个错误。根据 Chet 的说法,重定向不应该访问临时环境(IFS在这种情况下)

4

1 回答 1

7

我发现 4.2 的行为是正确的,因为分词应该在评估作业之前首先发生:

IFS=, cat <<< "${foo[*]}"

我相信 IFS 的新价值应该只影响cat而不是<<< "${foo[*]}".

正确的方法是

IFS=, eval 'cat <<< "${foo[*]}"'

对于保守的方法,我们可以使用一个函数:

function t { cat <<< "${foo[*]}"; }
IFS=, t

我也猜测它与此有关:

m.  Fixed a bug that caused here documents to not be displayed correctly
    when attached to commands inside compound commands.

更新

在 4.2 中可以找到另一个令人困惑的行为,该行为已在 4.3 中修复。通过这样做IFS=, cat <<< "${foo[*]}""${foo[*]}"可以很好地扩展"111 222 333"(不受 IFS 影响),如图cat所示111 222 333。但是,当我们这样做时IFS=, read bar <<< "${foo[*]}"; echo "$bar",输出将会111,222,333并且看起来好像"${foo[*]}"展开为"111,222,333". 这种不一致的行为在 Bash 4.3 中不再发生,而 Bash 4.3 的行为可能是一个修复。

于 2014-07-24T10:39:00.210 回答