# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # test behavior of readonly namerefs and namerefs referencing readonly variables # readonly nameref variable referencing read-write global variable bar=one declare -rn foo0=bar unset foo0 # unsets bar declare -p bar unset -n foo0 # cannot unset declare -p foo0 declare +r foo0 # modifies bar declare -p foo0 bar declare +r -n foo0 # error declare +n foo0 # error unset bar # readonly nameref variable without a value typeset -n foo1 typeset -r foo1 typeset -p foo1 typeset foo1=bar # error typeset +r foo1 # no-op, follows nameref chain to nothing typeset -p foo1 # nameref pointing to read-only global variable foo2=bar typeset -n foo2 typeset -r foo2 # changes bar typeset -p foo2 bar foo2=bar # error? typeset +r foo2 # attempts to change bar, error typeset -p foo2 bar # nameref unchanged # read-only nameref pointing to read-only global variable bar3=three declare -rn foo3=bar3 unset foo3 # unsets bar3 bar3=three declare -p bar3 unset -n foo3 # cannot unset readonly bar3 declare +r foo3 # error attempting to reference bar3 declare -p foo3 bar3 declare +r -n foo3 # error # readonly nameref pointing to read-write local -- can we remove nameref attr? func() { typeset bar4=four # readonly nameref typeset -n -r foo4=bar4 typeset -p foo4 bar4 typeset +n foo4 typeset -p foo4 } func unset -f func # readonly nameref pointing to read-write global -- can we remove nameref attr? bar4=four foo4=bar4 # readonly nameref typeset -n foo4 typeset -r -n foo4 typeset -p foo4 bar4 typeset +n foo4 typeset -p foo4 bar4=four : ${foo4=bar4} typeset -p foo4 bar4 # readonly local nameref without a value -- can we remove nameref attribute? func() { declare -r -n foo5 declare -p foo5 declare +n foo5 declare -p foo5 } func unset -f func # readonly global nameref without a value -- can we remove nameref attribute? declare -n foo5 declare -r -n foo5 declare -p foo5 declare +n foo5 declare -p foo5