I'm defining functions in a script with readonly local variables like this:
test.sh
function test_function() {
readonly local foo="bar"
}
Before sourcing, foo is of course undefined
$> echo $foo
$>
But then when I source and run the function
$> source test.sh
$> test_function
$> echo $foo
bar
$>
suddenly the variable has leaked beyond its scope. Removing readonly solves the problem. What am I misunderstanding about the use of areadonly and local and can both be used without this problem?
The use case is that I get errors/warnings, when calling test_function multiple times, because the variable is supposed to be readonly, but already defined.
Replace:
readonly local foo="bar"
with:
local -r foo="bar"
The issue is that readonly local foo="bar" defines two readonly variables: one named local and one namedfoo. It does not create any local variables.
By contrast, local -r foo="bar" creates a variable named foo which is both local and readonly.
As David C Rankin points out, once you have created a global read-only variable, you cannot unset it. You need to close your existing shell and start a new one.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With