Re: Zsh's and ksh's bang (!) expansion flags have different meanings
Philippe Altherr <[email protected]> Thu, 23 Jul 2026 16:41:54 +0200
| Newsgroups | gmane.comp.shells.zsh.devel |
|---|---|
| Message-ID | <CAGdYchuUcpeLbe62PeLmRzUD34g=TvrN34uUKNJJOXbiRTxiJA@mail.gmail.com> |
--00000000000090002d06574842a9
Content-Type: multipart/alternative; boundary="00000000000090002b06574842a7"
--00000000000090002b06574842a7
Content-Type: text/plain; charset="UTF-8"
Below is a patch that changes Zsh's emulation of ksh to map ksh's ! to just
(k) instead of (!k). Note that the flag combination (!k) is forbidden,
which I think is right.
Here is the ksh script that I used to compare Zsh's before and after patch
ksh emulation:
typeset str0=abc
typeset -a arr0=(aa bb cc)
typeset -A hsh0=([0]=aa [1]=bb [2]=cc)
typeset -n str1=str0 str2=str1
typeset -n arr1=arr0 arr2=arr1
typeset -n hsh1=hsh0 hsh2=hsh1
# Regular expansions
echo "${str0} - ${str1} - ${str2}"
echo "${str0[1]} - ${str1[1]} - ${str2[1]}"
echo "${str0[1,2]} - ${str1[1,2]} - ${str2[1,2]}"
echo "${str0[@]} - ${str1[@]} - ${str2[@]}"
echo "${arr0} - ${arr1} - ${arr2}"
echo "${arr0[1]} - ${arr1[1]} - ${arr2[1]}"
echo "${arr0[1,2]} - ${arr1[1,2]} - ${arr2[1,2]}"
echo "${arr0[@]} - ${arr1[@]} - ${arr2[@]}"
echo "${hsh0} - ${hsh1} - ${hsh2}"
echo "${hsh0[1]} - ${hsh1[1]} - ${hsh2[1]}"
echo "${hsh0[@]} - ${hsh1[@]} - ${hsh2[@]}"
# Bang expansions
echo "${!str0} - ${!str1} - ${!str2}"
echo "${!str0[1]} - ${!str1[1]} - ${!str2[1]}"
echo "${!str0[1,2]} - ${!str1[1,2]} - ${!str2[1,2]}"
echo "${!str0[@]} - ${!str1[@]} - ${!str2[@]}"
echo "${!arr0} - ${!arr1} - ${!arr2}"
echo "${!arr0[1]} - ${!arr1[1]} - ${!arr2[1]}"
echo "${!arr0[1,2]} - ${!arr1[1,2]} - ${!arr2[1,2]}"
echo "${!arr0[@]} - ${!arr1[@]} - ${!arr2[@]}"
echo "${!hsh0} - ${!hsh1} - ${!hsh2}"
echo "${!hsh0[1]} - ${!hsh1[1]} - ${!hsh2[1]}"
echo "${!hsh0[@]} - ${!hsh1[@]} - ${!hsh2[@]}"
Let's first have a look at regular expansions:
Zsh's ksh emulation
ksh
Zsh's ksh emulation
${!var} <=> ${(!k)var}
${!var} <=> ${(k)var}
str
str[1]
str[1,2]
str[@]
arr
arr[1]
arr[1,2]
arr[@]
hsh
hsh[1]
hsh[@]
abc - abc - abc
b - b - b
bc - bc - bc
abc - abc - abc
aa - aa - aa
bb - bb - bb
bb cc - bb cc - bb cc
aa bb cc - aa bb cc - aa bb cc
aa - aa - aa
bb - bb - bb
aa bb cc - aa bb cc - aa bb cc
abc - abc - abc
- -
- -
abc - abc - abc
aa - aa - aa
bb - bb - bb
cc - cc - cc
aa bb cc - aa bb cc - aa bb cc
aa - aa - aa
bb - bb - bb
aa bb cc - aa bb cc - aa bb cc
abc - abc - abc
b - b - b
bc - bc - bc
abc - abc - abc
aa - aa - aa
bb - bb - bb
bb cc - bb cc - bb cc
aa bb cc - aa bb cc - aa bb cc
aa - aa - aa
bb - bb - bb
aa bb cc - aa bb cc - aa bb cc
I highlighted in green the results that match the ksh results. As expected,
the results are the same before and after the patch but there are already
cases where they don't match the ksh results. That's because in ksh,
strings are NOT equated to arrays of characters and thus subscripts other
than [@] and [*] don't produce any result. Furthermore, in ksh, ${var[A,B]}
is equivalent to ${var[((A,B))]} and thus still returns a single element
rather than a range of elements like in Zsh.
Now let's see what happens for bang expansions:
Zsh's ksh emulation
ksh
Zsh's ksh emulation
${!var} <=> ${(!k)var}
${!var} <=> ${(k)var}
!str
!str[1]
!str[1,2]
!str[@]
!arr
!arr[1]
!arr[1,2]
!arr[@]
!hsh
!hsh[1]
!hsh[@]
abc - str0 - str1
b - t - t
bc - tr - tr
abc - str0 - str1
aa - arr0 - arr1
1 - r - r
<error> - rr - rr
aa bb cc - arr0 - arr1
aa - hsh0 - hsh1
1 - s - s
0 1 2 - hsh0 - hsh1
str0 - str0 - str0
str0[1] - str1[1] - str2[1]
str0[1,2] - str1[1,2] - str2[1,2]
0 - 0 - 0
arr0 - arr0 - arr0
arr0[1] - arr0[1] - arr0[1]
arr0[2] - arr0[2] - arr0[2]
0 1 2 - 0 1 2 - 0 1 2
hsh0 - hsh0 - hsh0
hsh0[1] - hsh0[1] - hsh0[1]
0 1 2 - 0 1 2 - 0 1 2
abc - abc - abc
b - b - b
bc - bc - bc
abc - abc - abc
aa - aa - aa
1 - 1 - 1
<error> - <error> - <error>
aa bb cc - aa bb cc - aa bb cc
aa - aa - aa
1 - 1 - 1
0 1 2 - 0 1 2 - 0 1 2
I highlighted in orange the results where Zsh does something similar
(return the index/key) but not in the exact same way as ksh (Zsh returns
just the index/key, while ksh returns the full parameter spec). The <error>
string indicates cases where the expansion fails with an error.
We can see that there are very few cases, either before or after the patch,
where Zsh's emulation matches ksh. In my opinion the results with the patch
are more compelling. It also leaves open the possibility to have more
matches in the future. Although Bart says it would be difficult, maybe we
can extend (k) to array ranges, or at least to [@] and [*]. With that the
last line of the array group would match. Another possibility is to extend
(k), at least in ksh emulation, to also work for plain values. This looks
feasible to me. The value structure computed by expansions typically
contains a reference to the expanded parameter (the referred one, not the
starting one), from which one can access its name. With that, the first
line of each group would match.
- Don't map ksh's ! to Zsh's (!k), map it to (k)
<https://github.com/zsh-users/zsh/compare/master...paltherr:zsh:dont-map-ksh-bang-to-zsh-bang>
Philippe
--00000000000090002b06574842a7
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr">Below is a patch that changes Zsh's e=
mulation of ksh to map ksh's=C2=A0! to just (k) instead of (!k). Note t=
hat the flag combination (!k) is forbidden, which I think is right.<div><br=
></div><div>Here is the ksh script that I used to compare Zsh's before =
and after patch ksh emulation:</div><div><br></div><div><font face=3D"monos=
pace">typeset =C2=A0 =C2=A0str0=3Dabc<br>typeset -a arr0=3D(aa bb cc)<br>ty=
peset -A hsh0=3D([0]=3Daa [1]=3Dbb [2]=3Dcc)<br><br>typeset -n str1=3Dstr0 =
str2=3Dstr1<br>typeset -n arr1=3Darr0 arr2=3Darr1<br>typeset -n hsh1=3Dhsh0=
hsh2=3Dhsh1<br><br># Regular expansions<br><br>echo "${str0} - ${str1=
} - ${str2}"<br>echo "${str0[1]} - ${str1[1]} - ${str2[1]}"<=
br>echo "${str0[1,2]} - ${str1[1,2]} - ${str2[1,2]}"<br>echo &quo=
t;${str0[@]} - ${str1[@]} - ${str2[@]}"<br><br>echo "${arr0} - ${=
arr1} - ${arr2}"<br>echo "${arr0[1]} - ${arr1[1]} - ${arr2[1]}&qu=
ot;<br>echo "${arr0[1,2]} - ${arr1[1,2]} - ${arr2[1,2]}"<br>echo =
"${arr0[@]} - ${arr1[@]} - ${arr2[@]}"<br><br>echo "${hsh0} =
- ${hsh1} - ${hsh2}"<br>echo "${hsh0[1]} - ${hsh1[1]} - ${hsh2[1]=
}"<br>echo "${hsh0[@]} - ${hsh1[@]} - ${hsh2[@]}"<br><br># B=
ang expansions<br><br>echo "${!str0} - ${!str1} - ${!str2}"<br>ec=
ho "${!str0[1]} - ${!str1[1]} - ${!str2[1]}"<br>echo "${!str=
0[1,2]} - ${!str1[1,2]} - ${!str2[1,2]}"<br>echo "${!str0[@]} - $=
{!str1[@]} - ${!str2[@]}"<br><br>echo "${!arr0} - ${!arr1} - ${!a=
rr2}"<br>echo "${!arr0[1]} - ${!arr1[1]} - ${!arr2[1]}"<br>e=
cho "${!arr0[1,2]} - ${!arr1[1,2]} - ${!arr2[1,2]}"<br>echo "=
;${!arr0[@]} - ${!arr1[@]} - ${!arr2[@]}"<br><br>echo "${!hsh0} -=
${!hsh1} - ${!hsh2}"<br>echo "${!hsh0[1]} - ${!hsh1[1]} - ${!hsh=
2[1]}"<br>echo "${!hsh0[@]} - ${!hsh1[@]} - ${!hsh2[@]}"</fo=
nt><br><div><br></div><div>Let's first have a look at regular expansion=
s:</div><div><br></div><div><span id=3D"gmail-docs-internal-guid-5b5ece27-7=
fff-6d20-6323-f3eb8675d69e"><div dir=3D"ltr" style=3D"margin-left:0pt" alig=
n=3D"left"><table style=3D"border-width:medium;border-style:none;border-col=
or:currentcolor;border-collapse:collapse"><colgroup><col width=3D"82"><col =
width=3D"269"><col width=3D"269"><col width=3D"269"></colgroup><tbody><tr s=
tyle=3D"height:0pt"><td style=3D"border-width:1pt;border-style:solid;border=
-color:rgb(0,0,0);vertical-align:top;background-color:rgb(204,204,204);padd=
ing:5pt;overflow:hidden"><br></td><td style=3D"border-width:1pt;border-styl=
e:solid;border-color:rgb(0,0,0);vertical-align:top;background-color:rgb(204=
,204,204);padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:=
1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-fa=
mily:Arial,sans-serif;color:rgb(0,0,0);background-color:transparent;font-we=
ight:700;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">=
Zsh's ksh emulation</span></p></td><td style=3D"border-width:1pt;border=
-style:solid;border-color:rgb(0,0,0);vertical-align:top;background-color:rg=
b(204,204,204);padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-he=
ight:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;fo=
nt-family:Arial,sans-serif;color:rgb(0,0,0);background-color:transparent;fo=
nt-weight:700;font-variant:normal;vertical-align:baseline;white-space:pre-w=
rap">ksh</span></p></td><td style=3D"border-width:1pt;border-style:solid;bo=
rder-color:rgb(0,0,0);vertical-align:top;background-color:rgb(204,204,204);=
padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;margin=
-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Arial=
,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:700;f=
ont-variant:normal;vertical-align:baseline;white-space:pre-wrap">Zsh's =
ksh emulation</span></p></td></tr><tr style=3D"height:0pt"><td style=3D"bor=
der-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align:top=
;background-color:rgb(239,239,239);padding:5pt;overflow:hidden"><br></td><t=
d style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vert=
ical-align:top;background-color:rgb(239,239,239);padding:5pt;overflow:hidde=
n"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt=
"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0=
,0,0);background-color:transparent;font-variant:normal;vertical-align:basel=
ine;white-space:pre-wrap">${!var} <=3D> ${(!k)var}</span></p></td><td=
style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);verti=
cal-align:top;background-color:rgb(239,239,239);padding:5pt;overflow:hidden=
"><br></td><td style=3D"border-width:1pt;border-style:solid;border-color:rg=
b(0,0,0);vertical-align:top;background-color:rgb(239,239,239);padding:5pt;o=
verflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;marg=
in-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-seri=
f;color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertica=
l-align:baseline;white-space:pre-wrap">${!var} <=3D> ${(k)var}</span>=
</p></td></tr><tr style=3D"height:0pt"><td style=3D"border-width:1pt;border=
-style:solid;border-color:rgb(0,0,0);vertical-align:top;padding:5pt;overflo=
w:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bot=
tom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;colo=
r:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-alig=
n:baseline;white-space:pre-wrap">str</span></p><p dir=3D"ltr" style=3D"line=
-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt=
;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transpar=
ent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">str[1=
]</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-b=
ottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;co=
lor:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-al=
ign:baseline;white-space:pre-wrap">str[1,2]</span></p><p dir=3D"ltr" style=
=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-s=
ize:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:=
transparent;font-variant:normal;vertical-align:baseline;white-space:pre-wra=
p">str[@]</span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:=
0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,s=
ans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:normal=
;vertical-align:baseline;white-space:pre-wrap">arr</span></p><p dir=3D"ltr"=
style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"=
font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-=
color:transparent;font-variant:normal;vertical-align:baseline;white-space:p=
re-wrap">arr[1]</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-to=
p:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas=
,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:norm=
al;vertical-align:baseline;white-space:pre-wrap">arr[1,2]</span></p><p dir=
=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:transparent;font-variant:normal;vertical-align:baseline;white=
-space:pre-wrap">arr[@]</span></p><br><p dir=3D"ltr" style=3D"line-height:1=
.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-fam=
ily:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-=
variant:normal;vertical-align:baseline;white-space:pre-wrap">hsh</span></p>=
<p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><=
span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,=
0);background-color:transparent;font-variant:normal;vertical-align:baseline=
;white-space:pre-wrap">hsh[1]</span></p><p dir=3D"ltr" style=3D"line-height=
:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-f=
amily:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;fon=
t-variant:normal;vertical-align:baseline;white-space:pre-wrap">hsh[@]</span=
></p></td><td style=3D"border-width:1pt;border-style:solid;border-color:rgb=
(0,0,0);vertical-align:top;padding:5pt;overflow:hidden"><p dir=3D"ltr" styl=
e=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-=
size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color=
:rgb(0,255,0);font-variant:normal;vertical-align:baseline;white-space:pre-w=
rap">abc - abc - abc</span></p><p dir=3D"ltr" style=3D"line-height:1.2;marg=
in-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Con=
solas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant=
:normal;vertical-align:baseline;white-space:pre-wrap">b - b - b</span></p><=
p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><s=
pan style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0=
);background-color:transparent;font-variant:normal;vertical-align:baseline;=
white-space:pre-wrap">bc - bc - bc</span></p><p dir=3D"ltr" style=3D"line-h=
eight:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;f=
ont-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,=
0);font-variant:normal;vertical-align:baseline;white-space:pre-wrap">abc - =
abc - abc</span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:=
0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,s=
ans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:norma=
l;vertical-align:baseline;white-space:pre-wrap">aa - aa - aa</span></p><p d=
ir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span=
style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);b=
ackground-color:rgb(0,255,0);font-variant:normal;vertical-align:baseline;wh=
ite-space:pre-wrap">bb - bb - bb</span></p><p dir=3D"ltr" style=3D"line-hei=
ght:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;fon=
t-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;=
font-variant:normal;vertical-align:baseline;white-space:pre-wrap">bb cc - b=
b cc - bb cc</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0=
pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sa=
ns-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:normal=
;vertical-align:baseline;white-space:pre-wrap">aa bb cc - aa bb cc - aa bb =
cc</span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;mar=
gin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-ser=
if;color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:normal;verti=
cal-align:baseline;white-space:pre-wrap">aa - aa - aa</span></p><p dir=3D"l=
tr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=
=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);backgro=
und-color:rgb(0,255,0);font-variant:normal;vertical-align:baseline;white-sp=
ace:pre-wrap">bb - bb - bb</span></p><p dir=3D"ltr" style=3D"line-height:1.=
2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-fami=
ly:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-=
variant:normal;vertical-align:baseline;white-space:pre-wrap">aa bb cc - aa =
bb cc - aa bb cc</span></p></td><td style=3D"border-width:1pt;border-style:=
solid;border-color:rgb(0,0,0);vertical-align:top;padding:5pt;overflow:hidde=
n"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt=
"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0=
,0,0);background-color:transparent;font-variant:normal;vertical-align:basel=
ine;white-space:pre-wrap">abc - abc - abc</span></p><p dir=3D"ltr" style=3D=
"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size=
:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:tra=
nsparent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">=
=C2=A0-=C2=A0 -=C2=A0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;mar=
gin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Co=
nsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varian=
t:normal;vertical-align:baseline;white-space:pre-wrap">=C2=A0-=C2=A0 -=C2=
=A0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin=
-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;=
color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-=
align:baseline;white-space:pre-wrap">abc - abc - abc</span></p><br><p dir=
=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:transparent;font-variant:normal;vertical-align:baseline;white=
-space:pre-wrap">aa - aa - aa</span></p><p dir=3D"ltr" style=3D"line-height=
:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-f=
amily:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;fon=
t-variant:normal;vertical-align:baseline;white-space:pre-wrap">bb - bb - bb=
</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bo=
ttom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;col=
or:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-ali=
gn:baseline;white-space:pre-wrap">cc - cc - cc</span></p><p dir=3D"ltr" sty=
le=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font=
-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-colo=
r:transparent;font-variant:normal;vertical-align:baseline;white-space:pre-w=
rap">aa bb cc - aa bb cc - aa bb cc</span></p><br><p dir=3D"ltr" style=3D"l=
ine-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:1=
0pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:trans=
parent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">aa=
- aa - aa</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt=
;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans=
-serif;color:rgb(0,0,0);background-color:transparent;font-variant:normal;ve=
rtical-align:baseline;white-space:pre-wrap">bb - bb - bb</span></p><p dir=
=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:transparent;font-variant:normal;vertical-align:baseline;white=
-space:pre-wrap">aa bb cc - aa bb cc - aa bb cc</span></p></td><td style=3D=
"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align=
:top;padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;m=
argin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:=
Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-var=
iant:normal;vertical-align:baseline;white-space:pre-wrap">abc - abc - abc</=
span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bott=
om:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color=
:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-align=
:baseline;white-space:pre-wrap">b - b - b</span></p><p dir=3D"ltr" style=3D=
"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size=
:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:tra=
nsparent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">=
bc - bc - bc</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0=
pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sa=
ns-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:normal=
;vertical-align:baseline;white-space:pre-wrap">abc - abc - abc</span></p><b=
r><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"=
><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,=
0,0);background-color:rgb(0,255,0);font-variant:normal;vertical-align:basel=
ine;white-space:pre-wrap">aa - aa - aa</span></p><p dir=3D"ltr" style=3D"li=
ne-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10=
pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,=
255,0);font-variant:normal;vertical-align:baseline;white-space:pre-wrap">bb=
- bb - bb</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt=
;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans=
-serif;color:rgb(0,0,0);background-color:transparent;font-variant:normal;ve=
rtical-align:baseline;white-space:pre-wrap">bb cc - bb cc - bb cc</span></p=
><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt">=
<span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0=
,0);background-color:rgb(0,255,0);font-variant:normal;vertical-align:baseli=
ne;white-space:pre-wrap">aa bb cc - aa bb cc - aa bb cc</span></p><br><p di=
r=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span =
style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);ba=
ckground-color:rgb(0,255,0);font-variant:normal;vertical-align:baseline;whi=
te-space:pre-wrap">aa - aa - aa</span></p><p dir=3D"ltr" style=3D"line-heig=
ht:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font=
-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);=
font-variant:normal;vertical-align:baseline;white-space:pre-wrap">bb - bb -=
bb</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin=
-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;=
color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:normal;vertical=
-align:baseline;white-space:pre-wrap">aa bb cc - aa bb cc - aa bb cc</span>=
</p></td></tr></tbody></table></div></span></div><div><br></div><div>I high=
lighted in green the results that match the ksh results. As expected, the r=
esults are the same before and after the patch but there are already cases =
where they don't match the ksh results. That's because in ksh, stri=
ngs are NOT equated to arrays of characters and thus subscripts other than =
[@] and [*] don't produce any result. Furthermore, in ksh, ${var[A,B]} =
is equivalent to ${var[((A,B))]} and thus still returns a single element ra=
ther than a range of elements like in Zsh.</div><div><br></div><div>Now let=
's see what happens for bang expansions:</div><div><br></div><div><span=
id=3D"gmail-docs-internal-guid-d18101e7-7fff-ca3f-e2f1-e83dfccbd4bc"><div =
dir=3D"ltr" style=3D"margin-left:0pt" align=3D"left"><table style=3D"border=
-width:medium;border-style:none;border-color:currentcolor;border-collapse:c=
ollapse"><colgroup><col width=3D"82"><col width=3D"269"><col width=3D"269">=
<col width=3D"269"></colgroup><tbody><tr style=3D"height:0pt"><td style=3D"=
border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align:=
top;background-color:rgb(204,204,204);padding:5pt;overflow:hidden"><br></td=
><td style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);v=
ertical-align:top;background-color:rgb(204,204,204);padding:5pt;overflow:hi=
dden"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:=
0pt"><span style=3D"font-size:10pt;font-family:Arial,sans-serif;color:rgb(0=
,0,0);background-color:transparent;font-weight:700;font-variant:normal;vert=
ical-align:baseline;white-space:pre-wrap">Zsh's ksh emulation</span></p=
></td><td style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0=
,0);vertical-align:top;background-color:rgb(204,204,204);padding:5pt;overfl=
ow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bo=
ttom:0pt"><span style=3D"font-size:10pt;font-family:Arial,sans-serif;color:=
rgb(0,0,0);background-color:transparent;font-weight:700;font-variant:normal=
;vertical-align:baseline;white-space:pre-wrap">ksh</span></p></td><td style=
=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-al=
ign:top;background-color:rgb(204,204,204);padding:5pt;overflow:hidden"><p d=
ir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span=
style=3D"font-size:10pt;font-family:Arial,sans-serif;color:rgb(0,0,0);back=
ground-color:transparent;font-weight:700;font-variant:normal;vertical-align=
:baseline;white-space:pre-wrap">Zsh's ksh emulation</span></p></td></tr=
><tr style=3D"height:0pt"><td style=3D"border-width:1pt;border-style:solid;=
border-color:rgb(0,0,0);vertical-align:top;background-color:rgb(239,239,239=
);padding:5pt;overflow:hidden"><br></td><td style=3D"border-width:1pt;borde=
r-style:solid;border-color:rgb(0,0,0);vertical-align:top;background-color:r=
gb(239,239,239);padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-h=
eight:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;f=
ont-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparen=
t;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">${!var}=
<=3D> ${(!k)var}</span></p></td><td style=3D"border-width:1pt;border=
-style:solid;border-color:rgb(0,0,0);vertical-align:top;background-color:rg=
b(239,239,239);padding:5pt;overflow:hidden"><br></td><td style=3D"border-wi=
dth:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align:top;backg=
round-color:rgb(239,239,239);padding:5pt;overflow:hidden"><p dir=3D"ltr" st=
yle=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"fon=
t-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-col=
or:transparent;font-variant:normal;vertical-align:baseline;white-space:pre-=
wrap">${!var} <=3D> ${(k)var}</span></p></td></tr><tr style=3D"height=
:0pt"><td style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0=
,0);vertical-align:top;padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D=
"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size=
:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:tra=
nsparent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">=
!str</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margi=
n-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif=
;color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical=
-align:baseline;white-space:pre-wrap">!str[1]</span></p><p dir=3D"ltr" styl=
e=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-=
size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color=
:transparent;font-variant:normal;vertical-align:baseline;white-space:pre-wr=
ap">!str[1,2]</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:=
0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,s=
ans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:normal=
;vertical-align:baseline;white-space:pre-wrap">!str[@]</span></p><br><p dir=
=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:transparent;font-variant:normal;vertical-align:baseline;white=
-space:pre-wrap">!arr</span></p><p dir=3D"ltr" style=3D"line-height:1.2;mar=
gin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Co=
nsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varian=
t:normal;vertical-align:baseline;white-space:pre-wrap">!arr[1]</span></p><p=
dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><sp=
an style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0)=
;background-color:transparent;font-variant:normal;vertical-align:baseline;w=
hite-space:pre-wrap">!arr[1,2]</span></p><p dir=3D"ltr" style=3D"line-heigh=
t:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-=
family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;fo=
nt-variant:normal;vertical-align:baseline;white-space:pre-wrap">!arr[@]</sp=
an></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bo=
ttom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;col=
or:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-ali=
gn:baseline;white-space:pre-wrap">!hsh</span></p><p dir=3D"ltr" style=3D"li=
ne-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10=
pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transp=
arent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">!hs=
h[1]</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margi=
n-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif=
;color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical=
-align:baseline;white-space:pre-wrap">!hsh[@]</span></p></td><td style=3D"b=
order-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align:t=
op;padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;mar=
gin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Co=
nsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varian=
t:normal;vertical-align:baseline;white-space:pre-wrap">abc - </span><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:rgb(0,255,0);font-variant:normal;vertical-align:baseline;whit=
e-space:pre-wrap">str0</span><span style=3D"font-size:10pt;font-family:Cons=
olas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:=
normal;vertical-align:baseline;white-space:pre-wrap"> - str1</span></p><p d=
ir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span=
style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);b=
ackground-color:transparent;font-variant:normal;vertical-align:baseline;whi=
te-space:pre-wrap">b - t - t</span></p><p dir=3D"ltr" style=3D"line-height:=
1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-fa=
mily:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font=
-variant:normal;vertical-align:baseline;white-space:pre-wrap">bc - tr - tr<=
/span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bot=
tom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;colo=
r:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-alig=
n:baseline;white-space:pre-wrap">abc - str0 - str1</span></p><br><p dir=3D"=
ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=
=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);backgro=
und-color:transparent;font-variant:normal;vertical-align:baseline;white-spa=
ce:pre-wrap">aa - </span><span style=3D"font-size:10pt;font-family:Consolas=
,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:nor=
mal;vertical-align:baseline;white-space:pre-wrap">arr0</span><span style=3D=
"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background=
-color:transparent;font-variant:normal;vertical-align:baseline;white-space:=
pre-wrap"> - arr1</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-=
top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consol=
as,sans-serif;color:rgb(0,0,0);background-color:rgb(255,153,0);font-variant=
:normal;vertical-align:baseline;white-space:pre-wrap">1</span><span style=
=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);backgro=
und-color:transparent;font-variant:normal;vertical-align:baseline;white-spa=
ce:pre-wrap"> - r - r</span></p><p dir=3D"ltr" style=3D"line-height:1.2;mar=
gin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Co=
nsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varian=
t:normal;vertical-align:baseline;white-space:pre-wrap"><error> - rr -=
rr</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin=
-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;=
color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-=
align:baseline;white-space:pre-wrap">aa bb cc - arr0 - arr1</span></p><br><=
p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><s=
pan style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0=
);background-color:transparent;font-variant:normal;vertical-align:baseline;=
white-space:pre-wrap">aa - </span><span style=3D"font-size:10pt;font-family=
:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-va=
riant:normal;vertical-align:baseline;white-space:pre-wrap">hsh0</span><span=
style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);b=
ackground-color:transparent;font-variant:normal;vertical-align:baseline;whi=
te-space:pre-wrap"> - hsh1</span></p><p dir=3D"ltr" style=3D"line-height:1.=
2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-fami=
ly:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(255,153,0);fon=
t-variant:normal;vertical-align:baseline;white-space:pre-wrap">1</span><spa=
n style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);=
background-color:transparent;font-variant:normal;vertical-align:baseline;wh=
ite-space:pre-wrap"> - s - s</span></p><p dir=3D"ltr" style=3D"line-height:=
1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-fa=
mily:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);fon=
t-variant:normal;vertical-align:baseline;white-space:pre-wrap">0 1 2</span>=
<span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0=
,0);background-color:transparent;font-variant:normal;vertical-align:baselin=
e;white-space:pre-wrap"> - hsh0 - hsh1</span></p></td><td style=3D"border-w=
idth:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align:top;padd=
ing:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top=
:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,=
sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:norma=
l;vertical-align:baseline;white-space:pre-wrap">str0 - str0 - str0</span></=
p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"=
><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,=
0,0);background-color:transparent;font-variant:normal;vertical-align:baseli=
ne;white-space:pre-wrap">str0[1] - str1[1] - str2[1]</span></p><p dir=3D"lt=
r" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=
=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);backgro=
und-color:transparent;font-variant:normal;vertical-align:baseline;white-spa=
ce:pre-wrap">str0[1,2] - str1[1,2] - str2[1,2]</span></p><p dir=3D"ltr" sty=
le=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font=
-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-colo=
r:transparent;font-variant:normal;vertical-align:baseline;white-space:pre-w=
rap">0 - 0 - 0</span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin=
-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Conso=
las,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:n=
ormal;vertical-align:baseline;white-space:pre-wrap">arr0 - arr0 - arr0</spa=
n></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:=
0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rg=
b(0,0,0);background-color:transparent;font-variant:normal;vertical-align:ba=
seline;white-space:pre-wrap">arr0[1] - arr0[1] - arr0[1]</span></p><p dir=
=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:transparent;font-variant:normal;vertical-align:baseline;white=
-space:pre-wrap">arr0[2] - arr0[2] - arr0[2]</span></p><p dir=3D"ltr" style=
=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-s=
ize:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:=
transparent;font-variant:normal;vertical-align:baseline;white-space:pre-wra=
p">0 1 2 - 0 1 2 - 0 1 2</span></p><br><p dir=3D"ltr" style=3D"line-height:=
1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-fa=
mily:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font=
-variant:normal;vertical-align:baseline;white-space:pre-wrap">hsh0 - hsh0 -=
hsh0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;marg=
in-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-seri=
f;color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertica=
l-align:baseline;white-space:pre-wrap">hsh0[1] - hsh0[1] - hsh0[1]</span></=
p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"=
><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,=
0,0);background-color:transparent;font-variant:normal;vertical-align:baseli=
ne;white-space:pre-wrap">0 1 2 - 0 1 2 - 0 1 2</span></p></td><td style=3D"=
border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align:=
top;padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;ma=
rgin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:C=
onsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varia=
nt:normal;vertical-align:baseline;white-space:pre-wrap">abc - abc - abc</sp=
an></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom=
:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:r=
gb(0,0,0);background-color:transparent;font-variant:normal;vertical-align:b=
aseline;white-space:pre-wrap">b - b - b</span></p><p dir=3D"ltr" style=3D"l=
ine-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:1=
0pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:trans=
parent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">bc=
- bc - bc</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt=
;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans=
-serif;color:rgb(0,0,0);background-color:transparent;font-variant:normal;ve=
rtical-align:baseline;white-space:pre-wrap">abc - abc - abc</span></p><br><=
p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><s=
pan style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0=
);background-color:transparent;font-variant:normal;vertical-align:baseline;=
white-space:pre-wrap">aa - aa - aa</span></p><p dir=3D"ltr" style=3D"line-h=
eight:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;f=
ont-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(255,15=
3,0);font-variant:normal;vertical-align:baseline;white-space:pre-wrap">1 - =
1 - 1</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;marg=
in-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-seri=
f;color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertica=
l-align:baseline;white-space:pre-wrap"><error> - <error> - <=
error></span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;=
margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-=
serif;color:rgb(0,0,0);background-color:transparent;font-variant:normal;ver=
tical-align:baseline;white-space:pre-wrap">aa bb cc - aa bb cc - aa bb cc</=
span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-=
bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;c=
olor:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-a=
lign:baseline;white-space:pre-wrap">aa - aa - aa</span></p><p dir=3D"ltr" s=
tyle=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"fo=
nt-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-co=
lor:rgb(255,153,0);font-variant:normal;vertical-align:baseline;white-space:=
pre-wrap">1 - 1 - 1</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margi=
n-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Cons=
olas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant=
:normal;vertical-align:baseline;white-space:pre-wrap">0 1 2 - 0 1 2 - 0 1 2=
</span></p></td></tr></tbody></table></div></span></div><div><br></div><div=
>I highlighted in orange the results where Zsh does something similar (retu=
rn the index/key) but not in the exact same way as ksh (Zsh returns just th=
e index/key, while ksh returns the full parameter spec). The <error> =
string indicates cases where the expansion fails with an error.</div><div><=
br></div><div>We can see that there are very few cases, either before or af=
ter the patch, where Zsh's=C2=A0emulation matches ksh. In my opinion th=
e results with the patch are more compelling. It also leaves open the possi=
bility to have more matches in the future. Although Bart says it would be d=
ifficult, maybe we can extend (k) to array ranges, or at least to [@] and [=
*]. With that the last line of the array group would match. Another possibi=
lity=C2=A0is to extend (k), at least in ksh emulation, to also work for pla=
in values. This looks feasible to me. The value structure computed by expan=
sions typically contains a reference to the expanded parameter (the referre=
d one, not the starting one), from which one can access its name. With that=
, the first line of each group would match.</div><div><br></div><div><div><=
div>- <a href=3D"https://github.com/zsh-users/zsh/compare/master...paltherr=
:zsh:dont-map-ksh-bang-to-zsh-bang" target=3D"_blank">Don't map ksh'=
;s ! to Zsh's (!k), map it to (k)</a></div><div><br></div><div>Philippe=
</div></div></div></div><div><br></div></div>
</div>
--00000000000090002b06574842a7--
--00000000000090002d06574842a9
Content-Type: text/plain; charset="US-ASCII"; name="dont-map-ksh-bang-to-zsh-bang.txt"
Content-Disposition: attachment;
filename="dont-map-ksh-bang-to-zsh-bang.txt"
Content-Transfer-Encoding: base64
Content-ID: <f_mrxkrlka0>
X-Attachment-Id: f_mrxkrlka0
ZGlmZiAtLWdpdCBhL1NyYy9zdWJzdC5jIGIvU3JjL3N1YnN0LmMKaW5kZXggMWI3NWMwMzVhLi5l
ZmJkODExMDUgMTAwNjQ0Ci0tLSBhL1NyYy9zdWJzdC5jCisrKyBiL1NyYy9zdWJzdC5jCkBAIC0y
MTE4LDcgKzIxMTgsNyBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIg
KipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzLAogCSAqIGhhbmRsZSB0aGlzIHdpdGggdGhlIF4s
ID0sIH4gc3R1ZmYsIGJlbG93LgogCSAqLwogCWlmICgoYyA9ICpzKSA9PSAnIScgJiYgc1sxXSAh
PSBPdXRicmFjZSAmJiBFTVVMQVRJT04oRU1VTEFURV9LU0gpKSB7Ci0JICAgIGhrZXlzID0gU0NB
TlBNX1dBTlRLRVlTfFNDQU5QTV9OT05BTUVSRUY7CisJICAgIGhrZXlzID0gU0NBTlBNX1dBTlRL
RVlTOwogCSAgICBzKys7CiAJICAgIC8qIFRoZXJlJ3MgYSBzbGV3IG9mIG90aGVyIHNwZWNpYWwg
YmFzaCBtZWFuaW5ncyBvZiBwYXJhbWV0ZXIKIAkgICAgICogcmVmZXJlbmNlcyB0aGF0IHN0YXJ0
IHdpdGggIiEiOgpkaWZmIC0tZ2l0IGEvVGVzdC9LMDFuYW1lcmVmLnp0c3QgYi9UZXN0L0swMW5h
bWVyZWYuenRzdAppbmRleCA5NWI4ZTVkYmMuLjg5NGUwMmMwYSAxMDA2NDQKLS0tIGEvVGVzdC9L
MDFuYW1lcmVmLnp0c3QKKysrIGIvVGVzdC9LMDFuYW1lcmVmLnp0c3QKQEAgLTIzNDksNCArMjM0
OSw1OSBAQCBGOmNvbnZlcnRpbmcgZnJvbSBhc3NvY2lhdGlvbi9hcnJheSB0byBzdHJpbmcgc2hv
dWxkIHdvcmsgaGVyZSB0b28KID5COjE2I0ZGCiA+QzoxNiNGRgogCisgdHlwZXNldCBzdHIwPWFi
YworIHR5cGVzZXQgLWEgYXJyMD0oYWEgYmIgY2MpCisgdHlwZXNldCAtQSBoc2gwPShbMF09YWEg
WzFdPWJiIFsyXT1jYykKKyB0eXBlc2V0IC1uIHN0cjE9c3RyMCBhcnIxPWFycjAgaHNoMT1oc2gw
CisgdHlwZXNldCAtbiBzdHIyPXN0cjEgYXJyMj1hcnIxIGhzaDI9aHNoMQorIGVtdWxhdGUga3No
IC1jICcKKyAgIGVjaG8gIiR7c3RyMH0gLSAke3N0cjF9IC0gJHtzdHIyfSIKKyAgIGVjaG8gIiR7
c3RyMFsxXX0gLSAke3N0cjFbMV19IC0gJHtzdHIyWzFdfSIKKyAgIGVjaG8gIiR7c3RyMFsxLDJd
fSAtICR7c3RyMVsxLDJdfSAtICR7c3RyMlsxLDJdfSIKKyAgIGVjaG8gIiR7c3RyMFtAXX0gLSAk
e3N0cjFbQF19IC0gJHtzdHIyW0BdfSIKKyAgIGVjaG8gIiR7YXJyMH0gLSAke2FycjF9IC0gJHth
cnIyfSIKKyAgIGVjaG8gIiR7YXJyMFsxXX0gLSAke2FycjFbMV19IC0gJHthcnIyWzFdfSIKKyAg
IGVjaG8gIiR7YXJyMFsxLDJdfSAtICR7YXJyMVsxLDJdfSAtICR7YXJyMlsxLDJdfSIKKyAgIGVj
aG8gIiR7YXJyMFtAXX0gLSAke2FycjFbQF19IC0gJHthcnIyW0BdfSIKKyAgIGVjaG8gIiR7aHNo
MH0gLSAke2hzaDF9IC0gJHtoc2gyfSIKKyAgIGVjaG8gIiR7aHNoMFsxXX0gLSAke2hzaDFbMV19
IC0gJHtoc2gyWzFdfSIKKyAgIGVjaG8gIiR7aHNoMFtAXX0gLSAke2hzaDFbQF19IC0gJHtoc2gy
W0BdfSIKKyAgIGVjaG8KKyAgIGVjaG8gIiR7IXN0cjB9IC0gJHshc3RyMX0gLSAkeyFzdHIyfSIK
KyAgIGVjaG8gIiR7IXN0cjBbMV19IC0gJHshc3RyMVsxXX0gLSAkeyFzdHIyWzFdfSIKKyAgIGVj
aG8gIiR7IXN0cjBbMSwyXX0gLSAkeyFzdHIxWzEsMl19IC0gJHshc3RyMlsxLDJdfSIKKyAgIGVj
aG8gIiR7IXN0cjBbQF19IC0gJHshc3RyMVtAXX0gLSAkeyFzdHIyW0BdfSIKKyAgIGVjaG8gIiR7
IWFycjB9IC0gJHshYXJyMX0gLSAkeyFhcnIyfSIKKyAgIGVjaG8gIiR7IWFycjBbMV19IC0gJHsh
YXJyMVsxXX0gLSAkeyFhcnIyWzFdfSIKKyAgIGVjaG8gIiQoZXhlYyAyPiYxOyBlY2hvICR7IWFy
cjBbMSwyXX0pIC0gJChleGVjIDI+JjE7IGVjaG8gJHshYXJyMVsxLDJdfSkgLSAkKGV4ZWMgMj4m
MTsgZWNobyAkeyFhcnIyWzEsMl19KSIKKyAgIGVjaG8gIiR7IWFycjBbQF19IC0gJHshYXJyMVtA
XX0gLSAkeyFhcnIyW0BdfSIKKyAgIGVjaG8gIiR7IWhzaDB9IC0gJHshaHNoMX0gLSAkeyFoc2gy
fSIKKyAgIGVjaG8gIiR7IWhzaDBbMV19IC0gJHshaHNoMVsxXX0gLSAkeyFoc2gyWzFdfSIKKyAg
IGVjaG8gIiR7IWhzaDBbQF19IC0gJHshaHNoMVtAXX0gLSAkeyFoc2gyW0BdfSIKKyAnCiswOmVt
dWxhdGlvbiBvZiBrc2gncyBiYW5nIGFsd2F5cyBkZXJlZmVyZW5jZXMgdGhlIGV4cGFuZGVkIHBh
cmFtZXRlcgorPmFiYyAtIGFiYyAtIGFiYworPmIgLSBiIC0gYgorPmJjIC0gYmMgLSBiYworPmFi
YyAtIGFiYyAtIGFiYworPmFhIC0gYWEgLSBhYQorPmJiIC0gYmIgLSBiYgorPmJiIGNjIC0gYmIg
Y2MgLSBiYiBjYworPmFhIGJiIGNjIC0gYWEgYmIgY2MgLSBhYSBiYiBjYworPmFhIC0gYWEgLSBh
YQorPmJiIC0gYmIgLSBiYgorPmFhIGJiIGNjIC0gYWEgYmIgY2MgLSBhYSBiYiBjYworPgorPmFi
YyAtIGFiYyAtIGFiYworPmIgLSBiIC0gYgorPmJjIC0gYmMgLSBiYworPmFiYyAtIGFiYyAtIGFi
YworPmFhIC0gYWEgLSBhYQorPjEgLSAxIC0gMQorPihldmFsKTo2OiBpbnZhbGlkIHN1YnNjcmlw
dCAtIChldmFsKTo2OiBpbnZhbGlkIHN1YnNjcmlwdCAtIChldmFsKTo2OiBpbnZhbGlkIHN1YnNj
cmlwdAorPmFhIGJiIGNjIC0gYWEgYmIgY2MgLSBhYSBiYiBjYworPmFhIC0gYWEgLSBhYQorPjEg
LSAxIC0gMQorPjAgMSAyIC0gMCAxIDIgLSAwIDEgMgorCiAlY2xlYW4K
--00000000000090002d06574842a9--