이것은 콜론으로 구분 된 값을 루프 처리하고 각 값이 인 코드입니다.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에서도 읽기 전용으로 -r -a args <<< "$ 1"'등을 사용하는 것이 좋습니다. $ {args [@]} "에 배열을 넣고'for arg '; do ...' –
이것은'zsh'이 POSIX *가해야 할 일을하는 경우입니다. POSIX는 가능한 한 많이 기존의 동작을 유지하는 데 부담이되지 않았습니다. 최악의 해결책으로'setopt SH_WORD_SPLIT'를 사용하여 POSIX 동작을 복원 할 수 있습니다. – chepner