It appears that pdksh and mksh has the scoping implementation I expected.
For example:
readonly x='global'
f() {
local x
readonly x='f'
echo $x
}
g() {
local x
readonly x='g'
echo $x
}
echo $x
f
g
echo $x
pdksh and mksh produce my expected result:
global
f
g
global
And Bash fails:
line 5: local: x: readonly variable
Dash and Ksh93 failed my expect, too. (I've changed local
to typeset
in Ksh93's test.)
This seems confusing.
UPDATE: I've edited the question. The question before is not stated in a clear way.