On Thu, Nov 12, 2020 at 2:48 AM Peter Stephenson < p.w.stephenson@ntlworld.com> wrote: > > This is a long standing feature of zsh, so the default behaviour > is not going to change. Almost certainly there was no direct > thought at the time zsh was implemented about the details > of this case, so it was probably not a formal syntactical > decision. > If we go back far enough, to the original Bourne shell, there's no such thing as local variables, no variable type except string, and no variable that can both exist and be unset. Everything is either in the exported global environment as a string, or it doesn't exist at all. The next step is variables that can exist in the global environment but are not exported. But they still always have to either be a (possibly empty) string, or not exist at all. Zsh preserves that behavior, then adds that you can explicitly unset a variable and zsh will remember its "type" as long as the variable is in the same scope.