On 7/23/15, Greg Wooledge <wool...@eeg.ccf.org> wrote: > People who use "readonly" are generally doing so in the context of a > "restricted shell" (yes, commence laughter) or other situation where > that specific variable is the key to unlocking something that the > administrator does not want the user to unlock. The entity who used > "readonly" is presumed to want that variable to remain unchanged, forever.
On 7/23/15, Stephane Chazelas <stephane.chaze...@gmail.com> wrote: > 2015-07-23 01:12:01 +0200, isabella parakiss: > What that means is that with this kind of dynamic scoping, > "readonly" is not very helpful. I don't remember ever using it. You guys are assuming that I am the one who uses readonly. I'm not, *bash* is. The fact is, I found out this by using BASH_REMATCH, trying to use it in different functions without interfering with each other. And it did work, sometimes. I couldn't even reproduce it in a new shell. It turns out that bash-completion uses it. And why wouldn't they? So my functions stopped working because I tried to... tab complete strace? WOW. This makes so much sense. I imagine that people want to be able to use something like this: extract_package () { local BASH_REMATCH if [[ $1 =~ (.*)-([0-9]+\.[0-9]+)\.tar.gz ]]; then tar xf "$1" if install_package; then echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]} successfully installed" else echo "Couldn't install ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}" fi fi } install_package () { local BASH_REMATCH some legit use of [[ =~ ]] } Anyway for some reason that I don't fully understand, the above won't even work when BASH_REMATCH is not defined, as shown below. $ declare -p BASH_REMATCH bash: declare: BASH_REMATCH: not found $ f () { local BASH_REMATCH; [[ abc =~ .(.*). ]]; g; declare -p BASH_REMATCH; } $ g () { local BASH_REMATCH; [[ xyz =~ .(.*). ]]; } $ f bash: declare: BASH_REMATCH: not found $ f bash: local: BASH_REMATCH: readonly variable bash: local: BASH_REMATCH: readonly variable declare -ar BASH_REMATCH='([0]="xyz")' $ To sum it up: for some reason that you can't control, local variables may or may not be assigned correctly. Also don't use local BASH_REMATCH because it doesn't work. Bash is a very usable language and this is totally not a problem. --- xoxo iza