Shouldn't readonly (-r) prevent type changes?

Philippe Altherr <[email protected]> Sat, 25 Jul 2026 16:18:07 +0200
Newsgroups gmane.comp.shells.zsh.devel
Message-ID <CAGdYchuy8pgfohz0aqeV60e0Yu8Z_548n8jD20b86NHtZtoE5Q@mail.gmail.com>
--0000000000001cc4640657702905
Content-Type: text/plain; charset="UTF-8"

When a parameters is read-only (-r), it's value can't be changed, not even
with a typeset:

% () { typeset -r var=1; typeset var=2 }
(anon): read-only variable: var
% () { typeset -r -i var=1; typeset -i var=2 }
(anon): read-only variable: var
% () { typeset -r -a var=(1); typeset -a var=(2) }
(anon): read-only variable: var

Shouldn't that restriction extend to type changes?

% () { typeset -r var=1; typeset -i var=2; typeset -p var }
typeset -ir var=2
% () { typeset -r -i var=1; typeset +i var=2; typeset -p var }
typeset -r var=2
% () { typeset -r -i var=1; typeset -a var; typeset -p var }
typeset -ar var=(  )
% () { typeset -r -a var=(1); typeset -i var; typeset -p var }
typeset -ir var=0

Bash seems to forbid all type changes for read-only parameters, while ksh
prevents most, sometimes without any error message, and allows some like
"typeset -r -i var; typeset -a var", which creates a read-only array of
integers.

Philippe

--0000000000001cc4640657702905
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">When a parameters=C2=A0is read-only=C2=A0(-r), it&#39;s va=
lue can&#39;t be changed, not even with a typeset:<div><br></div><div><font=
 face=3D"monospace">% () { typeset -r var=3D1; typeset var=3D2 }<br>(anon):=
 read-only variable: var<br>% () { typeset -r -i var=3D1; typeset -i var=3D=
2 }<br>(anon): read-only variable: var<br>% () { typeset -r -a var=3D(1); t=
ypeset -a var=3D(2) }<br>(anon): read-only variable: var</font><br></div><d=
iv><br></div><div>Shouldn&#39;t that restriction extend to type changes?</d=
iv><div><br></div><div><font face=3D"monospace">% () { typeset -r var=3D1; =
typeset -i var=3D2; typeset -p var }<br>typeset -ir var=3D2<br>% () { types=
et -r -i var=3D1; typeset +i var=3D2; typeset -p var }<br>typeset -r var=3D=
2<br>% () { typeset -r -i var=3D1; typeset -a var; typeset -p var } <br>typ=
eset -ar var=3D( =C2=A0)<br>% () { typeset -r -a var=3D(1); typeset -i var;=
 typeset -p var }<br>typeset -ir var=3D0</font><br></div><div><br></div><di=
v>Bash seems to forbid all type changes for read-only parameters, while ksh=
 prevents most, sometimes without any error message, and allows some like &=
quot;typeset -r -i var; typeset -a var&quot;, which creates a read-only arr=
ay of integers.</div><div><br></div><div>Philippe</div><div><br></div></div=
>

--0000000000001cc4640657702905--