테스트된 모든 쉘은 다음 코드를 사용하여 (인용된) "$*" 및 "$@" 쌍에 대해 동일한 작업을 수행합니다.
c='set a b @ c; IFS=:,@ ; a=$(printf "<%s> " "$*"); b=$(printf "<%s> " "$@"); printf "%-20s and %-20s\n" "$a" "$b"'
d=(sh ash dash attsh ksh lksh mksh bash b44sh y2sh zsh zsh4 "zsh -y")
for shell in "${d[@]}"; do
printf '%15s: ' "$shell"
$shell -c "$c"
done
결과:
sh: <a:b:@:c> and <a> <b> <@> <c>
ash: <a:b:@:c> and <a> <b> <@> <c>
dash: <a:b:@:c> and <a> <b> <@> <c>
attsh: <a:b:@:c> and <a> <b> <@> <c>
ksh: <a:b:@:c> and <a> <b> <@> <c>
lksh: <a:b:@:c> and <a> <b> <@> <c>
mksh: <a:b:@:c> and <a> <b> <@> <c>
bash: <a:b:@:c> and <a> <b> <@> <c>
b44sh: <a:b:@:c> and <a> <b> <@> <c>
y2sh: <a:b:@:c> and <a> <b> <@> <c>
zsh: <a:b:@:c> and <a> <b> <@> <c>
zsh4: <a:b:@:c> and <a> <b> <@> <c>
zsh -y: <a:b:@:c> and <a> <b> <@> <c>
그러나 인용되지 않고 테스트된 경우 $*
( $@
변경 $c
해야 함):
c='set a b @ c; IFS=:,@ ; a=$(printf "<%s> " $*); b=$(printf "<%s> " $@); printf "%-20s and %-20s\n" "$a" "$b"'
결과 :
sh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
ash: <a> <b> <> <> <c> and <a> <b> <> <> <c>
dash: <a> <b> <> <> <c> and <a> <b> <> <> <c>
attsh: <a> <b> <> <c> and <a> <b> <> <c>
ksh: <a> <b> <> <c> and <a> <b> <> <c>
lksh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
mksh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
bash: <a> <b> <> <> <c> and <a> <b> <> <> <c>
b44sh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
y2sh: <a> <b> <> <> <c> and <a> <b> <> <> <c>
zsh: <a> <b> <@> <c> and <a> <b> <@> <c>
zsh4: <a> <b> <@> <c> and <a> <b> <@> <c>
zsh -y: <a> <b> <> <> <c> and <a> <b> <@> <c>
ksh에서 중복 값을 제거하는 것을 제외하고 zsh를 제외한 모든 쉘은 동일한 방식으로 작동합니다. 그 중 하나가 표시됩니다 @
. 이는 변수가 기본적으로 참조되는 경우(또는 분할이 기본적으로 수행되지 않는 경우) 합리적일 수 있습니다.
그러나 다른 모든 쉘에 대한 기본값을 가져오려고 하고 zsh에 사용된 변수를 분할(역참조)하도록 요청하면 다른 값을 얻습니다 $*
.$@
다음으로 다시 변경하세요 $c
.
c='set a b @ c; IFS=:,@ ; a=$(printf "<%s> " $*); b=$(printf "<%s> " $@); [ "$a" = "$b" ] && echo "Yes" || echo "Nope"'
우리는 다음과 같은 명확한 결과를 얻습니다.
sh: Yes
ash: Yes
dash: Yes
attsh: Yes
ksh: Yes
lksh: Yes
mksh: Yes
bash: Yes
b44sh: Yes
y2sh: Yes
zsh: Yes
zsh4: Yes
zsh -y: Nope
zsh에만 따옴표가 없는(구분된) $*
및 $@
같음이 없습니다.
답변1
그건허점(반품)zsh-4.3.11-dev-4 버전에서 도입됨2011년부터 지금까지이 변경 세트.
이 수정 사항은 이제 버전 5.3(2016년 12월 11일 출시) 이상에 포함되었습니다. 이 버그는 버전 4.3.11-dev-4부터 5.2까지 영향을 미칩니다.