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.