为什么这个 IFS 变量赋值不影响它之前的 cmd?

Why does this IFS variable assignment not affect the cmd it precedes?

考虑这个 bash session:

set -- 1 2 3
echo "$*"          # 1 2 3  (as expected)
IFS=a echo "$*"    # 1 2 3  (why not "1a2a3"?)
IFS=a; echo "$*"   # 1a2a3a (as expected)

Try it online!

为什么 "assignment before command" 语法无法在单个命令的持续时间内将 IFS 设置为不同的值?看来您必须首先使用单独的命令更改 IFS 的值。

因为IFS影响命令的解析(分词、分词),所以必须在解析该命令之前设置。这就是为什么IFS=a echo "$*"只能用原来的IFS,不能用a

这有点类似于 FOO=bar echo $FOO 不回显 bar 的情况。 $FOO 被替换(空),然后执行命令及其变量赋值。