zsh中的IFS与bash的行为不同

时间:2016-12-25 09:57:51

标签: bash zsh

foo() {
    local lines=$(ls -l)
    local IFS=$'\n'
    for line in $lines; do
        echo $line
    done
}

在zsh中,循环只执行一次,因为ls -l命令的输出没有被新行分割,整个文本块被传递到$ line。 但是在bash中,按预期工作。我怎样才能在两个shell中都有完全相同的行为?

我不是在寻找一种可以循环使用的替代解决方案" ls"输出。试着理解为什么它不能在zsh中工作但在bash中工作得很好。而不是" ls"命令可以是其他任何东西。例如" ps -a"。行为是一样的。输出不是按行分割的。

谢谢!

1 个答案:

答案 0 :(得分:1)

默认情况下,ZSH不会拆分单词(与其他shell一样):

foo() {
    local lines=$(ls -l)

    local IFS=$'\n'
    if [ $ZSH_VERSION ]; then
      setopt sh_word_split
    fi

    for line in $lines; do
        echo line: $line
    done
}

foo

使用his answer将积分转到@ chris-johnsen。我支持他的论点以更好地使用数组(如果可能):

local lines=("$(ls -l)")

其他选项是(仅限ZSH):