テストされたすべてのシェルは、次のコードを使用して(引用符付き)「$ *」と「$ @」のペアに対して同じことを行います。
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 まで影響します。