zsh 在参数扩展后没有被 IFS 拆分

Lon*_*ner 5 bash shell posix zsh ifs

这是我的代码,用于遍历冒号分隔的值并对每个值执行某些操作。

f()
{
    IFS=:
    for arg in $1
    do
        echo arg: $arg
    done
}

f foo:bar:baz
Run Code Online (Sandbox Code Playgroud)

这在大多数符合 POSIX 的 shell 中都可以正常工作。

$ dash foo.sh
arg: foo
arg: bar
arg: baz
$ bash foo.sh
arg: foo
arg: bar
arg: baz
$ ksh foo.sh
arg: foo
arg: bar
arg: baz
$ posh foo.sh
arg: foo
arg: bar
arg: baz
$ yash foo.sh
arg: foo
arg: bar
arg: baz
Run Code Online (Sandbox Code Playgroud)

但它在 zsh 中没有按预期工作。

$ zsh foo.sh
arg: foo:bar:baz
Run Code Online (Sandbox Code Playgroud)

zsh这里是否违反了POSIX

hch*_*baw 3

是的。Zsh选择了自己的方式。

\n\n

这是 zsh 常见问题解答条目:\n \xe2\x80\x9c3.1: 为什么 $var where var="foo bar" 没有达到我的预期?\xe2\x80\x9d

\n\n

在这种特殊情况下,您可以通过将该-y选项添加到zsh来解决此问题:

\n\n
$ zsh -y foo.sh\narg: foo\narg: bar\narg: baz\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

你可以看看zsh 的常见问题解答,尤其是第 2 章和第 3 章。\n你体验其他 shell 的次数越多,你就越能发现 zsh 的陷阱。

\n