IFS随Bash 4.2而改变

IFS随Bash 4.2而改变,bash,ifs,Bash,Ifs,运行这些命令会得到预期的结果 $ 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 &l

运行这些命令会得到预期的结果

$ 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
造成这种差异的原因是什么

我在这里找到了答案

看起来这一直都是一个错误。据切特说,, 重定向不应该有权访问临时环境
如果在这种情况下

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

IFS=, cat <<< "${foo[*]}"
对于保守方法,我们可以使用一个函数:

function t { cat <<< "${foo[*]}"; }
IFS=, t
使现代化
另一个令人困惑的行为可以在4.2中找到,它已经在4.3中修复。通过执行IFS=,cat@fedorqui-spooky,我在GNU bash上,版本4.2.452-release x86_64-slackware-linux-GNU,并且可以复制OP的行为,使用GNU bash,版本4.3.111-release x86_64-pc-linux-GNU进行复制。输出是111 222 333对于那些感兴趣的人来说,这是bash 4.2的变更日志:在某些地方必须有一些解释,因为当这个变更发生时,它是从4.1到4.2。这也可能与正确支持here字符串和IFS有着松散的联系,因为IFS似乎是一个持续的过程。+1 cat不使用IFS;像IFS=,read是一个bc工作,因为read是一个bash内置程序,而不是一个外部程序。
function t { cat <<< "${foo[*]}"; }
IFS=, t