これはコロンで区切られた値をループして各値を するコードです。zshはパラメータ展開後にIFSで分割されません
f()
{
IFS=:
for arg in $1
do
echo arg: $arg
done
}
f foo:bar:baz
これはほとんどのPOSIX準拠のシェルで正常に動作します。
$ 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
しかし、zshでは期待通りに動作しません。
$ zsh foo.sh
arg: foo:bar:baz
zshはPOSIXに違反していますか?
はい、zshのがここ違反して故意に意図的です。つまり、文字列分割に頼っているのは、どのシェルでも良い習慣ではありません。つまり、bashでも、 'read -r -a args <<<" $ 1 "'などを使って読むことをお勧めします$ {args [@]} ";で配列の中に' for arg 'を挿入します。 do ... ... –
これは、 'zsh'がPOSIX *が何をすべきかを行う場合です。POSIXは既存の動作を可能な限り維持することに負担を掛けていませんでした。最悪の解決法として、 'setopt SH_WORD_SPLIT'を使ってPOSIXの動作を復元することができます。 – chepner