# 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 . # # post-bash-5.2 changes to make readonly/export operate on arrays at previous # local scopes the way they operate on scalars declare string declare -i int declare -a array init_vars () { readonly string="foo" readonly int=100 readonly array=(1 2) # Print the (hopefully) readonly variables echo inside init_vars acting on previous scope local -p string int array } echo global initial declare -p string int array # make readonly operate on local variables at a previous context foo () { local string ; local -i int ; local -a array init_vars echo inside foo, after init_vars local -p string int array } foo echo global after foo declare -p string int array unset -f foo init_vars2 () { readonly int=100+42 echo init_vars2 local -p int # previous scope, not local here } foo2 () { local -i int init_vars2 echo foo2, after init_vars2 local -p int } foo2 echo global after calling foo2 declare -p int foo3() { init_vars } foo3 echo global values after foo placeholder declare -p string int array