Bash 当设置在同一行上时,echo为什么不考虑IFS?

Bash 当设置在同一行上时,echo为什么不考虑IFS?,bash,Bash,在bash中,为什么不是这样: declare -a array=(a b c d e) IFS=',' echo "${array[*]}" 同: echo_wrapper() { echo "$*" } declare -a array=(a b c d e) IFS=',' echo_wrapper "${array[@]}" 展开发生在简单命令中的变量赋值之前: 当执行一个简单的命令时,shell从左到右执行以下扩展、分配和重定向 解析器标记为变量赋值(命令名之前的赋值)和

在bash中,为什么不是这样:

declare -a array=(a b c d e)
IFS=',' echo "${array[*]}"
同:

echo_wrapper()
{
    echo "$*"
}

declare -a array=(a b c d e)
IFS=',' echo_wrapper "${array[@]}"

展开发生在简单命令中的变量赋值之前:

当执行一个简单的命令时,shell从左到右执行以下扩展、分配和重定向

  • 解析器标记为变量赋值(命令名之前的赋值)和重定向的单词将保存以供以后处理
  • 非变量赋值或重定向的单词将展开(请参见Shell展开)。如果展开后仍有任何单词,则第一个单词将作为命令名,其余单词将作为参数
  • 如上所述执行重定向(请参阅重定向)
  • 每个变量赋值中“=”后面的文本在被赋值给变量之前都会经历波浪号展开、参数展开、命令替换、算术展开和引号删除
  • 第1步识别您的
    IFS
    分配,但不执行。步骤2使用
    IFS
    的现有值展开
    “${array[*]}”
    。然后,步骤4更改
    IFS
    的值

    解决方法,如果不需要修改流程环境、工作目录等:使用子shell

    (IFS=, ; echo "${array[*]}")
    
    不同的解决方法

    join () {
        local IFS=$1    # changes to IFS are localized to the function
        shift
        echo "$*"
    }
    
    join , "${array[@]}"