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を除くすべてのシェルは同じように動作します。そのうちの1つが表示されます@。これは、変数がデフォルトで参照されている場合(または分割がデフォルトで実行されない場合)に合理的である可能性があります。

ただし、他のすべてのシェルのデフォルト値を取得しようとし、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 まで影響します。

関連情報