zsh는 인용되지 않은 `$*`와 `$@`를 동일하게 유지할 수 없습니다.

zsh는 인용되지 않은 `$*`와 `$@`를 동일하게 유지할 수 없습니다.

테스트된 모든 쉘은 다음 코드를 사용하여 (인용된) "$*" 및 "$@" 쌍에 대해 동일한 작업을 수행합니다.

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까지 영향을 미칩니다.

관련 정보